gpt4 book ai didi

c++ - 是否可以检测 C++ 中的 namespace 成员身份?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:04 25 4
gpt4 key购买 nike

对于 C++ 类型,<type_traits> header 为我们提供了许多有用的编译时反射功能。例如。 std::is_base_of<B, D>::value在编译时确定是否 BD 的基类.

我想知道是否可以按照类似的方式检测命名空间成员资格?例如。给定一个命名空间 N类型 T , 有没有办法确定是否 T包含在 N 中使用 IS_NAMESPACE_MEMBER_OF(T,N) 形式的宏表达式.

我更喜欢通过任何类型的 SFINAE/ADL 类型的技巧获得编译时答案。或者,如果这是不可能的,那么标准不允许这样做的某种推理。

一个不可移植的运行时 hack 是正则表达式 typeid(T).name()对于 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!

最佳答案

命名空间不是有效的模板参数,因此它永远不可能是类特征。也许你可以用宏做一些模糊的事情。您可以在测试命名空间中注入(inject)函数,并将 ADL 与 sizeof/decltype 技巧结合使用,以查看选择了哪个重载。

关于c++ - 是否可以检测 C++ 中的 namespace 成员身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com