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!