【问题标题】:Vector template question矢量模板问题
【发布时间】:2011-03-31 10:15:56
【问题描述】:

问题,因为我对向量和模板做得不多。

如果我有一个类 foo,它是模板类,并且我想创建一个 foo 指针向量而不考虑 foo 类型,那么语法是什么样的?

【问题讨论】:

    标签: c++ templates vector


    【解决方案1】:

    没有直接的方法可以做到这一点。同一模板的不同实例被视为不同的类,彼此没有关系。

    如果您想统一对待它们,一种选择是创建一个基类,然后模板foo 类从该基类继承。例如:

    class foo_base {
        /* ... */
    };
    
    template <typename T> class foo: public foo_base {
        /* ... */
    };
    

    现在,您可以创建一个vector&lt;foo_base*&gt; 来存储指向foo_base 对象的指针,这些对象又是foo 的所有特化。

    【讨论】:

      【解决方案2】:

      你不会的。类模板foo(例如foo&lt;int&gt;foo&lt;char&gt; 等)的每个实例化都是一个不同的类型foo 本身不是类型

      您需要为它们提供一些基类并存储指针,利用多态性。

      【讨论】:

        【解决方案3】:

        不可能。当您在任何地方使用类模板时,您需要在类型上实例化它。
        一种规避方法是为foo 提供多态接口基类,并拥有这些指针的向量。

        class IFoo{
          virtual void bar() = 0;
          virtual int baz() = 0;
        };
        
        template<class T>
        class Foo : IFoo{
           // concrete implementations for bar and baz
        };
        
        // somewhere in your code:
        std::vector<IFoo*> vecFoo.
        vecFoo.push_back(new Foo<int>);
        

        明显的问题是,您不需要知道 barbaz 函数的每个可能的返回值。

        【讨论】:

          【解决方案4】:

          您不能拥有foo&lt;?&gt; 的向量。编译器在创建向量时需要准确知道它存储的类型,因为foo&lt;?&gt; 的每个实例化都可能具有不同的大小和完全不同的成员(因为您可以提供显式和部分特化)。

          您需要给foo&lt;T&gt; 一个公共基类,然后将baseclass 指针放入向量中(最好使用shared_ptr 或类似的东西)。

          作为替代方案,有现成的类可以对您隐藏它并充当引用容器。其中有boost::ptr_vector,不过也需要一个通用的类型来存储。

          class common_base { 
            /* functions to access the non-templates parts of a foo<T> .. */ 
          };
          
          template<typename T> class foo : public common_base { };
          

          【讨论】:

            【解决方案5】:

            如果您试图在不指定 T 的情况下模拟概念:“指向 Foo 的指针向量”,那么您正在尝试模拟当前标准不支持的模板类型定义。

            解决方法是

            template <class T>
            my_vector
            {
               typedef std::vector<Foo<T>*> type;
            }
            

            如果相反,你可以为你的 Foo 人买得起多态接口,我会按照已经建议的那样做。

            【讨论】:

              猜你喜欢
              • 2011-07-16
              • 2013-05-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-19
              • 2015-10-07
              • 2012-04-15
              相关资源
              最近更新 更多