【问题标题】:C++ Using pointers to template objectsC++ 使用指向模板对象的指针
【发布时间】:2011-02-23 23:48:28
【问题描述】:

我有一个名为 ABC 的类,它有一个类模板:

template <class T> class ABC{}

在另一个类中,我试图将对象 ABC 存储在列表中:

class CDE{
private:
  list<ABC *> some_list; 
}

我打算存储可能具有不同类模板参数的 ABC 对象。是否有必要在编译时为指针指定模板?如果容器应该存储不同类型的对象怎么办?这不可能吗?

【问题讨论】:

    标签: c++ templates pointers template-specialization


    【解决方案1】:

    是否需要在编译时为指针指定模板?

    是的。

    如果容器应该存储不同类型的对象怎么办?这不可能吗?

    这是(直接)不可能的。

    没有 ABC 类这样的东西。只有ABC的实例化,例如ABC&lt;Foo&gt;ABC&lt;Bar&gt;。这些是完全不同的类。

    你可以这样做:

    template<typename T>
    class ABC : public ABC_Base
    {
      ...
    }
    
    list<ABC_Base*> some_list;
    

    通过这样做,您的所有 ABC 实例都有一个共同的基类型,您可以任意使用基指针。

    【讨论】:

    • 这听起来很合理,但有一点缺点。使用模板的全部原因是确保对象紧密耦合。这样仍然有机会创建没有模板类型的 ABC_Base(或其派生类)的对象并在列表中使用它们。
    • @cyrux 如果你把ABC_Base抽象化,那么没有人可以创建ABC_Base的对象。
    【解决方案2】:

    您需要在CDE 类中指定模板参数,或者也将CDE 设为模板。

    第一个选项:

    class CDE {
    private:
        list< ABC<int>* > some_list;
    };
    

    第二个选项:

    template <class T>
    class CDE {
    private:
        list< ABC<T>* > some_list;
    };
    

    【讨论】:

      【解决方案3】:

      列表只能存储一种类型。模板的不同实例是不同的类型。如果这令人满意,您可以这样做:

      template &lt;class T&gt; class CDE{ private: list&lt;ABC&lt;T&gt; *&gt; some_list; }

      如果您需要使用不同的类型,也许您可​​以为 ABC 创建一个非模板基类并存储指向它的指针。 (即使用接口)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        相关资源
        最近更新 更多