【问题标题】:List of objects of different classes C++不同类 C++ 的对象列表
【发布时间】:2012-06-10 16:56:58
【问题描述】:

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

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

(if T == int)  
   field = INT

虽然我可能对预处理器有所了解,但我对此并不熟悉。

【问题讨论】:

  • 您可能只需要展示至少一些代码以及您真正想要做的事情,以获得有意义的答案。试图找到实例化模板的类型通常表明存在问题。

标签: c++ class list


【解决方案1】:

多态背后的整个想法是隐藏特定的实现,使其在程序流中透明。使用类的类型作为指标会使您的代码因if 语句而膨胀,并且更难维护。

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

【讨论】:

    【解决方案2】:

    您可以使用运算符typeid

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

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

    (我有点不清楚您为什么将int 与多态性联系起来。int 不能派生自。)

    【讨论】:

      【解决方案3】:

      您可能正在寻找的就是所谓的类型特征。它们允许您确定特定类型的属性并对其采取行动。您可以从 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;
      }
      

      【讨论】:

      • 这里有一个问题:enum 在模板的每个实例化中都被声明,因此Foo&lt;char&gt;::TypeFoo&lt;int&gt;::Type 是不同的类型。您应该在模板之外声明enum,并且可以选择使用typedef 导入它。此外,虽然它有效,但从类型到enum 的转换应该通过重载一个函数来完成,而不是为单个函数提供运行时检查(尽管实际上它们应该被优化)。对于更复杂的情况,需要对 T 执行操作,您将遇到此模式的问题。
      • 啊,谢谢。甚至没有考虑Type的位置。我把它删减了一点,以更接近 OP 的例子。周围少了很多。
      【解决方案4】:

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

      您可以查看typeid operator 作为构建这种机制的一种方法,但请注意该页面下方的RTTI 误用部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        相关资源
        最近更新 更多