gpt4 book ai didi

c++ - 无法验证我的父类(super class)或基类是否是宏或模板所声称的那样

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:48 26 4
gpt4 key购买 nike

最近我一直在处理一个令人沮丧的问题。我有很多想隐藏在宏中的反射代码。这些 COMPONENT_x() 宏习惯于这样:

class ComponentBase : public IComponent
{
COMPONENT(ComponentBase)
};

class ComponentDerived1 : public ComponentBase
{
COMPONENT_DERIVED(ComponentDerived1, ComponentBase)
};

以上是完全正确的。但是,我希望在这种情况下发生编译错误:

class ComponentDerived2 : public ComponentDerived1
{
COMPONENT_DERIVED(ComponentDerived2, ComponentBase)
// ^^^^^^^^^^^^^
// This type claims to have a superclass of ComponentBase in the above macro,
// but we really derive from ComponentDerived1.
//
// I want this to result in a compile error.
};

也就是说,当我声称我的父类(super class)(或我的基类)是 ComponentBase 而我的父类(super class)实际上是 ComponentDerived1 时,我理想情况下喜欢编译时错误。

我无法轻易检测到这种情况的原因是,虽然我的父类(super class)是 ComponentDerived1,但该类的父类(super class)是 ComponentBase — 因此它也是我的基类之一类。 (我知道 ComponentDerived1 是一个 ComponentBase,所以也许有比“基类”更好的短语。)

有一些评论质疑我为什么要这样做。我正在使用优化的组件生成系统,它将所有相同类型的对象放入离散缓冲区,因此如果我想拥有一个 API,例如 getComponentsThatImplement(ComponentDerived1::getType() );

我一起砍过one solution适用于 g++:

class ComponentBase : public IComponent
{
COMPONENT(ComponentBase)

protected:
static void helperComponentBase(); // COMPONENT(ComponentBase)
};

class ComponentDerived1 : public ComponentBase
{
COMPONENT_DERIVED(ComponentDerived1, ComponentBase)

private:
using ComponentBase::helperComponentBase; // COMPONENT_DERIVED(..., ComponentBase)
};

class ComponentDerived2 : public ComponentDerived1
{
COMPONENT_DERIVED(ComponentDerived2, ComponentBase)

private:
using ComponentBase::helperComponentBase; // error: this function is already hidden
}

不幸的是,Xcode 4.3.2 的 clang 似乎不支持以这种方式使用 using。我检查了 boost 的类型特征库,但没有发现任何有用的信息。我使用的是 C++11,因此我可以使用现代结构。

还有其他聪明的想法吗?

最佳答案

你可以利用这样一个事实,即你不能从一个 c'tor 直接调用你的 super 的 super 的 c'tor:

enum PATERNITY_TEST_ENUM { PATERNITY_TEST }; 

#define COMPONENT(CLASS) \
public: CLASS(PATERNITY_TEST_ENUM) { } private:

#define COMPONENT_DERIVED(CLASS, SUPER) \
public: CLASS(PATERNITY_TEST_ENUM) : SUPER(PATERNITY_TEST) { } private:

关于c++ - 无法验证我的父类(super class)或基类是否是宏或模板所声称的那样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935313/

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