对于C ++类型,
我想知道是否可能通过类似的方式检测命名空间成员资格?例如:给定一个具有类型
我更喜欢通过任何类型的SFINAE / ADL技巧获得编译时答案。或者,如果不可能,一些说明为什么标准不允许这样做。
对于非便携式和运行时黑客,可以对
<type_traits>
头文件为我们提供了许多有用的编译时反射功能。例如:std::is_base_of<B,D>::value
可以在编译时确定B
是否是D
的基类。我想知道是否可能通过类似的方式检测命名空间成员资格?例如:给定一个具有类型
T
的命名空间N
,是否有一种方法可以使用形式为IS_NAMESPACE_MEMBER_OF(T,N)
的宏表达式来确定T
是否包含在N
中。我更喜欢通过任何类型的SFINAE / ADL技巧获得编译时答案。或者,如果不可能,一些说明为什么标准不允许这样做。
对于非便携式和运行时黑客,可以对
typeid(T).name()
进行regex以获取N
,但这相当繁琐且不在编译时。
EDIT1 :如K-ballo指出的那样,不能将命名空间用作模板参数,因此似乎不可能使用类型特征。
EDIT2 :这是由K-ballo提示的骨架:那里可以制作出什么漂亮的测试?#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!
struct T {}; namespace N { struct T; }
,你希望结果是true还是false?那么对于这段代码namespace A { struct T {}; } namespace B { using ::A::T; }
,T
是否属于A
命名空间? - David Rodríguez - dribeasT
是A
的一部分,也是B
的一部分。为什么T
不能成为多个(非嵌套)命名空间的成员呢?毕竟,T
还可以是许多其他类的基类或派生类。我不是要确定T
的作用域链的整个链。只是一个简单的问题:T
是否包含在N
中(通过直接定义或通过using
语句)。 - TemplateRex