gpt4 book ai didi

c++ - 检查一个类型是否直接派生自 "enable if"上下文中的另一个类型(是其子级)

转载 作者:行者123 更新时间:2023-12-01 19:33:52 25 4
gpt4 key购买 nike

C++ 有 is_base_of<Base,Derived> 。但是,这也包括“祖 parent ”类型。

有没有办法获得 is_child_of<Parent,Child>功能?目的是在 SFINAE 上下文中将类型用作哨兵“接口(interface)”标记,而不受可能添加或不添加到父类型的哨兵的影响。

也就是说,下面的输出预计是“true, false”。 (is_base_of 的输出为“true, true”。)

#include <iostream>
#include <type_traits>

class A {};

class B : A {};

class C : B {};

int main()
{
std::cout << std::boolalpha;
std::cout << "a2b: " << std::is_child_of<A, B>::value << '\n';
std::cout << "a2c: " << std::is_child_of<A, C>::value << '\n';
}

最佳答案

C++ 没有反射,子对象的存储包含父对象的存储,并且很难在一个子对象和另一个子对象之间划清界限。一些元编程必须是dome,模仿类似于Qt或MFC\WFC的库

#include <iostream>
#include <type_traits>

#define DECLARE_CLASS(Name, ParentName) using Parent = ParentName;
#define PARENT_CLASS(Name) Name::Parent

class LibBase {
public:
DECLARE_CLASS(LibBase, void)
};

class A : public LibBase {
public:
DECLARE_CLASS(A, LibBase)
};

class B : public A {
public:
DECLARE_CLASS(B, A)
};

int main()
{
std::cout << std::boolalpha;
std::cout << std::is_same<PARENT_CLASS(B), A>::value << std::endl;
std::cout << std::is_same<PARENT_CLASS(B), LibBase>::value << std::endl;
}

显然,这种简单的方法有一个缺陷,如果没有使用我们的宏定义类,我们不会收到错误。并且它只是静态的,

第一个问题可以通过通过声明创建一个“trait”嵌套类来解决,该类根据传递给 DECLARE_OBJECT 的类名获取名称。这将使 PARENT_CLASS(Name) 的结果变得唯一,例如

#define DECLARE_CLASS(Name,  ParentName)  struct TraitsOf##Name { \
using Parent = ParentName; \
};

#define PARENT_CLASS(Name) Name::TraitsOf##Name::Parent

第二个问题可以通过在宏定义中创建自己的 RTTI 函数来解决

可悲的形式is_child_of<LibBase, A>::value这是无法实现的,因为宏替换发生在模板替换之前。也许可以使用一些静态注册方法来为类提供等待 BOOST_TYPEOF 所做的独特特征,但摆脱用户代码中的宏定义几乎是不可能的。

关于c++ - 检查一个类型是否直接派生自 "enable if"上下文中的另一个类型(是其子级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129251/

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