【发布时间】: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<Base<A>> -
nope.i 不知道继承类的数量,任何类型都可以推入向量中。
-
它们是不相关的类型,如果不使用 boost 变体或类似的东西,你不能将它们放入同一个向量中
-
我对 boost 变体不太了解,但我读过它,它就像 union 但问题是继承类的数量未知,所以我不能使用 boost 变体模板
-
假设您以某种方式获得了一个存储不同类型的向量,每个向量都为其打印实现采用不同的参数集。你想如何使用它们?因为调用者必须以某种方式知道他必须为每个元素传递哪些参数。
标签: c++ templates inheritance vector