【问题标题】:How to store template class in a vector?如何将模板类存储在向量中?
【发布时间】:2014-10-24 05:08:39
【问题描述】:

我有以下代码,我想将Base<A> * a,Base<B> * b 存储在向量中而不会丢失 typename,所以我想实现vector<.....> vec; vec.push_back(a); vec.push_back(b); 并调用 这个vec[0]->DoJob(3,4); vector[1]->DoJob(3,4,"blablba");。 我该怎么做?如果有办法做到这一点,我可以完全改变设计。

/*this code works*/
template<typename T>
class Base{
protected:
    virtual ~Base(){}
public:
    template<typename ... Args>
    void DoJob(Args ... args){
        T * t = dynamic_cast<T*>(this);
        t->print(args...);
    }
};


class A:public Base<A>{
public:
    void print(int a, int b){
        cout << a << b << endl;
    }
};

class B :public Base<B>{
public:
    void print(float a, double b, string s){
        cout << a << b << s << endl;
    }
};


Base<A> * a = new A();
a->DoJob(3, 4);
Base<B> * b = new B();
b->DoJob(3, 4,"blabla");

【问题讨论】:

  • 你不能只添加矢量吗? std::vector&lt;Base&lt;A&gt;&gt;
  • nope.i 不知道继承类的数量,任何类型都可以推入向量中。
  • 它们是不相关的类型,如果不使用 boost 变体或类似的东西,你不能将它们放入同一个向量中
  • 我对 boost 变体不太了解,但我读过它,它就像 union 但问题是继承类的数量未知,所以我不能使用 boost 变体模板
  • 假设您以某种方式获得了一个存储不同类型的向量,每个向量都为其打印实现采用不同的参数集。你想如何使用它们?因为调用者必须以某种方式知道他必须为每个元素传递哪些参数。

标签: c++ templates inheritance vector


【解决方案1】:

实现类似的一种相当常见的方法是拥有一个容器,其中包含指向公共超类的指针。

class BaseSuperclass {
// ...
};

template<typename T> class Base : public BaseSuperclass {
// ...
};

std::vector<BaseSuperclass *> vector;

然后可以将任何Base&lt;T&gt; * 推入您的向量中。

请注意,当您迭代或检索向量的内容时,您最终得到的只是BaseSuperclass *。然后你必须弄清楚你手头有哪个子类。

【讨论】:

  • 我需要知道派生类,所以只存储没有类型的 basesuperclass 不适合我的情况。
  • 获取每个实例的派生类有很多不同的技术。但是,就将指向这些派生类的指针存储在单个向量中而言,这是一种相当常见的方法。获取原始派生类,这是一个单独的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2022-07-25
  • 2012-12-16
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多