Czy jest możliwe wykrycie członkostwa w przestrzeni nazw w C ++?

Dla typów C ++<type_traits> Nagłówek daje nam wiele przydatnych możliwości refleksji podczas kompilacji. Na przykład.std::is_base_of<B, D>::value określa podczas kompilacji, czyB jest klasą podstawowąD.

Zastanawiam się, czy możliwe byłoby wykrycie członkostwa w przestrzeni nazw w podobny sposób? Na przykład. otrzymałem przestrzeń nazwN z typemT, czy istnieje sposób na określenie, czyT jest zawarta wewnątrzN za pomocą makrowyrazu formularzaIS_NAMESPACE_MEMBER_OF(T,N).

Wolałbym odpowiedź na czas kompilacji za pomocą dowolnego rodzaju sztuczki SFINAE / ADL. Albo, jeśli nie jest to możliwe, jakieś uzasadnienie, dlaczego standard na to nie pozwala.

Nie przenośny i działający w czasie hack to regextypeid(T).name() dlaN, ale jest to dość nużące, a nie kompilacyjne.

EDIT1: jak wskazał K-ballo, przestrzeń nazw nie może być używana jako parametr szablonu, więc cecha typu wydaje się niemożliwa.

EDIT2: oto szkielet, na co wskazuje K-ballo: jaki fajny test może (lub nie może) zostać tam przygotowany?

#define IS_NAMESPACE_MEMBER_OF(T, N) \
                                     \
// global declaration                \
void test(T);                        \
                                     \
// namespace declaration             \
namespace N {                        \
    void test(T);                    \
}                                    \
                                     \
// some clever name lookup / sizeof / SFINAE test!     

questionAnswers(1)

yourAnswerToTheQuestion