我已经想出使用多态并让列表存储指向baseClass的指针,但是在成功放置它之后,我想知道该对象最初是什么类。我正在使用类的模板,并希望有另一个字段,它将是基本类型的枚举。
现在的问题是:有没有办法检查(在运行时或编译期间)
(if T == int)
field = INT
我虽然可能与预处理器有关,但我对此并不熟悉。
答案 0 :(得分:4)
多态性背后的整个想法是隐藏特定的实现,使其在程序流中透明化。使用类的类型作为指标将使您的代码膨胀if
语句并且将更难维护。
我建议您重新考虑您的设计并使用预期的行为方法创建一个抽象类,并使用此类类型作为列表对象类型。比每个对象调用接口方法(在抽象类中声明并在派生类中实现)
答案 1 :(得分:1)
您可以使用运营商typeid
。
例如,如果T
是指向基类的指针:
if (typeid(SomeDerivedClass) == typeid(*T))
...
(我有点不清楚为什么你在谈论与多态性有关的int
时。int
无法从中派生出来。)
答案 2 :(得分:1)
您可能正在寻找的是被称为类型特征。它们允许您确定特定类型的属性并对其进行操作。您可以从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;
}
答案 3 :(得分:0)
C ++预处理器对C ++一无所知。它是一个通用的符号操纵器,可以与大多数任何编程语言一起使用,或者就任何文本处理应用程序使用,例如单词或方程布局处理的特征。
您可以将typeid operator视为构建此类机制的一种方法,但请注意该页面上的滥用RTTI 部分。