¿Es posible detectar la pertenencia al espacio de nombres en C ++?
Para los tipos de C ++, el<type_traits>
El encabezado nos da muchas capacidades útiles de reflexión en tiempo de compilación. P.ej.std::is_base_of<B, D>::value
determina en tiempo de compilación siB
es una clase base deD
.
Me pregunto si sería posible detectar la pertenencia al espacio de nombres en líneas similares. P.ej. dado un espacio de nombresN
con un tipoT
, hay una manera de determinar siT
está contenido dentroN
utilizando una expresión macro del formularioIS_NAMESPACE_MEMBER_OF(T,N)
.
Prefiero una respuesta en tiempo de compilación a través de cualquier tipo de truco de tipo SFINAE / ADL. O, si no es posible, algún tipo de razonamiento por el cual la Norma no lo permitiría.
Un hack no portátil y en tiempo de ejecución sería regextypeid(T).name()
paraN
, pero esto es bastante tedioso y no en tiempo de compilación.
EDITAR1: como lo señala K-ballo, un espacio de nombres no se puede usar como parámetro de plantilla, por lo que un rasgo de tipo parece imposible.
EDIT2: aquí está el esqueleto como lo insinuó K-ballo: ¿qué prueba ingeniosa puede (o no puede) cocinarse allí?
#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!