¿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!     

Respuestas a la pregunta(1)

Su respuesta a la pregunta