2014-08-30 55 views
0

我已经下面的代码,我想存储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

难道你只是添加矢量? 'std :: vector >' – Vladp 2014-08-30 09:42:57

+0

nope.i不知道继承类的数量,任何类型都可以推入向量中。 – DRoW 2014-08-30 09:47:20

+1

他们是不相关的类型,你不能把它们放入同一个矢量,而不使用增强变体或类似的东西 – 2014-08-30 10:15:33

回答

0

一个相当常见的方式来实现类似的东西将是一个容器与指向一个公共超类的指针。

class BaseSuperclass { 
// ... 
}; 

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

std::vector<BaseSuperclass *> vector; 

然后,任何Base<T> *可以推入你的载体。

请注意,当您迭代或检索矢量的内容时,最终返回的结果是BaseSuperclass *。然后你必须弄清楚你手边有哪个子类。

+0

我需要知道派生类,所以只存储basesuperclass而不输入它不会适用于我的情况。 – DRoW 2014-08-30 13:42:51

+0

有许多不同的技术来获得每个实例的派生类。但是,就存储指向这些派生类的指针而言,这是一种相当常见的方法。获取原始派生类,这是一个单独的主题。 – 2014-08-30 14:08:44