有没有办法防止使用静态断言和类型特征两次派生类?

发布于 2024-12-26 17:29:32 字数 224 浏览 7 评论 0原文

我意识到这是一个人为的示例,但我想要进行编译检查以防止这种情况......

class A {};
class B : public A {};
class C : public A {};

class D : public B, public C
{
    BOOST_STATIC_ASSERT((is_base_of_once<A,D>::value))
};

I realize this is a contrived example, but I want a compile check to prevent this...

class A {};
class B : public A {};
class C : public A {};

class D : public B, public C
{
    BOOST_STATIC_ASSERT((is_base_of_once<A,D>::value))
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

美煞众生 2025-01-02 17:29:32

以下应该有效:

BOOST_STATIC_ASSERT(((A*)(D*)0 == 0)) 

如果 A 存在两次,这应该会引发歧义错误,否则测试将始终成功(因为它比较两个空指针)。

The following should work:

BOOST_STATIC_ASSERT(((A*)(D*)0 == 0)) 

If A exists twice, this should rise an ambiguity error, while otherwise the test will always succeed (because it compares two null pointers).

凝望流年 2025-01-02 17:29:32

当我尝试派生一个类两次时,它甚至无法编译。 (重复碱基类型)

When I try to derive a class twice as you have here it does not even compile. (duplicate base type)

疏忽 2025-01-02 17:29:32

如果您真的愿意,您可以测试两个基类:

class A {};
class B : public A {};
class C : public A {};

class D : public B, public C
{
    static_assert(!(is_base_of<A,B>::value && is_base_of<A,C>::value),
                   "Invalid inheritance!");
};

否则您可以使这些类从 A 继承,这样派生类中仍然只有一个它的实例:

class A {};
class B : public virtual A {};
class C : public virtual A {};

class D : public B, public C
{
    // only one A here
};

If you really want to, you an test both your base classes:

class A {};
class B : public A {};
class C : public A {};

class D : public B, public C
{
    static_assert(!(is_base_of<A,B>::value && is_base_of<A,C>::value),
                   "Invalid inheritance!");
};

Otherwise you can make the classes inherit virtually from A, so that there will still only be one instance of it in the derived class:

class A {};
class B : public virtual A {};
class C : public virtual A {};

class D : public B, public C
{
    // only one A here
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文