我已经想出使用多态性并让列表存储指向基类的指针,但是在成功将其放置在那里之后,我想知道该对象最初是什么类。我正在为类使用模板,并希望有另一个字段,它是基本类型的枚举。
现在的问题是:有没有办法检查(在运行时或编译期间)
(if T == int)
field = INT
我虽然可能与预处理器有关,但我对此并不熟悉。
多态性背后的整个想法是隐藏特定的实现,使其在程序流中透明。使用类的类型作为指标会使你的代码变得臃肿且if
难以维护。
我建议您重新考虑您的设计并使用预期的行为方法创建一个抽象类,并将此类类型用作列表对象类型。比为每个对象调用接口方法(在抽象类中声明并在派生类中实现)
您可以使用运算符typeid
。
例如,如果T
是指向基类的指针:
if (typeid(SomeDerivedClass) == typeid(*T))
...
(我有点不清楚你为什么谈论int
多态性。 int
不能派生自。)
您可能正在寻找的东西被称为类型特征。它们允许您确定特定类型的属性并对其采取行动。您可以根据您的要求从那里开始std::is_integral()
并从那里构建。std::is_floating_point()
enum Type
{
Unknown,
Integral,
Float
};
....
Type field = Unknown;
if(std::is_integral<T>::value)
{
field = Integral;
}
else if(std::is_floating_point<T>::value)
{
field = Float;
}
C++ 预处理器对 C++ 一无所知。它是一个通用的符号操纵器,可以与大多数编程语言一起使用,或者就此而言,任何文本处理应用程序,例如单词或方程式布局处理的功能。
您可能会将typeid运算符视为构建这种机制的一种方式,但请注意该页面下方的 RTTI 误用部分。