0

我已经想出使用多态性并让列表存储指向基类的指针,但是在成功将其放置在那里之后,我想知道该对象最初是什么类。我正在为类使用模板,并希望有另一个字段,它是基本类型的枚举。

现在的问题是:有没有办法检查(在运行时或编译期间)

(if T == int)  
   field = INT

我虽然可能与预处理器有关,但我对此并不熟悉。

4

4 回答 4

4

多态性背后的整个想法是隐藏特定的实现,使其在程序流中透明。使用类的类型作为指标会使你的代码变得臃肿且if难以维护。

我建议您重新考虑您的设计并使用预期的行为方法创建一个抽象类,并将此类类型用作列表对象类型。比为每个对象调用接口方法(在抽象类中声明并在派生类中实现)

于 2012-06-10T17:04:08.830 回答
1

您可以使用运算符typeid

例如,如果T是指向基类的指针:

if (typeid(SomeDerivedClass) == typeid(*T))
...

(我有点不清楚你为什么谈论int多态性。 int不能派生自。)

于 2012-06-10T17:02:14.017 回答
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;
}
于 2012-06-10T17:28:01.990 回答
0

C++ 预处理器对 C++ 一无所知。它是一个通用的符号操纵器,可以与大多数编程语言一起使用,或者就此而言,任何文本处理应用程序,例如单词或方程式布局处理的功能。

您可能会将typeid运算符视为构建这种机制的一种方式,但请注意该页面下方的 RTTI 误用部分。

于 2012-06-10T17:04:12.737 回答