2014-08-30 1 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

+0

nope.i 상속받은 클래스의 수는 알지 못하며 모든 타입을 벡터로 푸시 할 수 있습니다. – DRoW

+1

그들은 관련이없는 유형입니다. 부스트 변종이나 비슷한 것을 사용하지 않고 같은 벡터에 넣을 수 없습니다 –

답변

0

컨테이너를 공통 수퍼 클래스에 대한 포인터와 함께 구현하는 방법은 매우 일반적입니다.

class BaseSuperclass { 
// ... 
}; 

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

std::vector<BaseSuperclass *> vector; 

그러면 Base<T> *을 벡터에 푸시 (push) 할 수 있습니다.

벡터의 내용을 반복하거나 내용을 검색 할 때 돌아 오는 결과는 BaseSuperclass *입니다. 그러면 어느 하위 클래스에 있는지 파악해야합니다.

+0

파생 된 클래스를 알아야하기 때문에 유형이 없으면 단지 basesuperclass 만 저장하면 내 상황에는 효과가 없을 것입니다. – DRoW

+0

각 인스턴스의 파생 클래스를 얻기위한 여러 가지 기술이 있습니다. 그러나 파생 된 클래스에 대한 포인터를 단일 벡터에 저장하는 것과 같이 매우 일반적인 방법입니다. 파생 클래스를 가져 오는 것은 별도의 주제입니다. –

관련 문제