C++ 递归检查超类类型\u信息
有没有办法检查超类的类型信息是什么? 在我的系统中,对象由一组位标识。由类型\信息哈希代码标识。我希望其中一些类型能够启用多态性,因为我的系统认为它们处于相同的位之下。type_info为每个类类型创建一个唯一的hashcode。相反,我希望派生类采用其超类的位集,如下所示:C++ 递归检查超类类型\u信息,c++,superclass,typeid,typeinfo,C++,Superclass,Typeid,Typeinfo,有没有办法检查超类的类型信息是什么? 在我的系统中,对象由一组位标识。由类型\信息哈希代码标识。我希望其中一些类型能够启用多态性,因为我的系统认为它们处于相同的位之下。type_info为每个类类型创建一个唯一的hashcode。相反,我希望派生类采用其超类的位集,如下所示: Component > ISomeInterfaceComponent -> bit = 00001 | \ ComponentContextA -&
Component > ISomeInterfaceComponent -> bit = 00001
|
\ ComponentContextA -> bit = ISomeInterFaceComponent bit
|
\ ComponentContextB -> bit = ISomeInterFaceComponent bit
|
\ ComponentContextC -> bit = ISomeInterFaceComponent bit
这应该将包含组件的对象添加到一个系统中进行处理
目前情况如下:
Component > ISomeInterFaceComponent -> bit = 00001
|
\ ComponentContextA -> bit = 00010
|
\ ComponentContextB -> bit = 00100
|
\ ComponentContextC -> bit = 01000
这要求我为所有组件创建不同的系统
如果有人能给我指点我如何才能做到这一点,那就太好了
编辑:
为防止混淆,为类型设置位,如下所示:
ComponentTypeManager::getBit()
所以我不使用实例。而且我希望保持当前系统处于锁定状态。为什么不在基类
ISomeInterFaceComponent
中创建一个不被任何派生类修改的变量(除非您特别希望)。听起来您并不希望多态性,因为您希望位值是相同的,而不管派生类类型如何,而不是根据类型而变化。如果将来需要为某个派生类型重写If,仍然可以专门为该类执行此操作
或者,您可以在基类中使用一个虚拟函数,该函数返回一个int(位值-或它实际上是什么类型),并且在希望与基类具有相同位值的派生类中不重写它
比如说
class ISomeInterFaceComponent {
virtual int GetBit() { return 1;}; // return bit value
};
class ComponentContextA : public ISomeInterFaceComponent {
// Do not override GetBit() - let the base class function get called.
};
我意识到没有任何自动的方式。不过,如果我理解你的意思,那么只需稍加努力就可以做到 对于每个“基类”,添加一个引用自身的typedef,并在
typeid()
中使用它。注意,子类可以选择覆盖它。如果他们这样做,那么他们将获得自己的ID,他们的孩子将使用他们的价值观
请注意,如果您根本不想使用typeid()
,另一种解决方案是在基类上有一个静态成员(或成员函数),该成员为基类返回正确的值,然后在getBit()函数中直接调用它
#include <iostream>
#include <iomanip>
#include <typeinfo>
struct Base1
{
typedef Base1 Base;
};
struct Base2
{
typedef Base2 Base;
};
struct Derived1A : public Base1 { };
struct Derived1B : public Base1 { };
struct Derived2A : public Base2 { };
struct Derived2B : public Base2 { };
template <typename T>
std::size_t getBit()
{
// Do whatever you normally do here, but use T::Base instead of T
return std::hash<std::string>()(typeid(typename T::Base).name());
}
int main()
{
std::cout << std::boolalpha << getBit<Derived1A>() << " == " << getBit<Derived1B>() << " " << (getBit<Derived1A>() == getBit<Derived1B>()) << "\n";
std::cout << std::boolalpha << getBit<Derived2A>() << " == " << getBit<Derived2B>() << " " <<(getBit<Derived2A>() == getBit<Derived2B>()) << "\n";
}
#包括
#包括
#包括
结构Base1
{
typedef Base 1 Base;
};
结构Base2
{
typedef Base 2 Base;
};
struct-Derived1A:public-Base1{};
struct-Derived1B:public-Base1{};
struct-Derived2A:public-Base2{};
struct-Derived2B:public-Base2{};
模板
std::size\u t getBit()
{
//执行通常在这里执行的操作,但使用T::Base而不是T
返回std::hash();
}
int main()
{
std::cout,因为类型是由它们的实际类名而不是实例定义的。获取位类型如下:ComponentTypeManager::getBit();在这种情况下,我不使用实例。我直接使用类本身。@Sidar-我明白了。在这种情况下,我不知道。对不起。我写到“我可以只使用type\u信息来做这件事吗?”?C++11提供了一个is_base_模板来做同样的事情。但是在我的情况下,创建几十个if/else是不实际的。我真的认为我需要重新设计它。谢谢你的回复。但是我不认为这是可行的,因为所有的东西都是从一个组件类派生的,它在一个基本级别上支持多态性。我想我必须重新设计它噢。@Sidar:好吧,它应该仍然有效。没有什么能阻止Base1和Base2拥有一个通用的超类型。