我已经关注了代码,并希望将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");
答案 0 :(得分:0)
实现类似的一种相当常见的方法是使用一个带有指向公共超类的指针的容器。
class BaseSuperclass {
// ...
};
template<typename T> class Base : public BaseSuperclass {
// ...
};
std::vector<BaseSuperclass *> vector;
然后可以将任何Base<T> *
推入您的矢量。
请注意,当您迭代或检索向量的内容时,所有您最终都会获得BaseSuperclass *
。然后,您必须弄清楚手头有哪个子类。