2009-03-30 6 views
8

알 수없는 길이 또는 인수 개수가있는 메시지를 작성하고 싶습니다. 나는다른 템플릿 유형을 하나의 벡터에 넣는 방법

template <typename T> class Argument { 
public: 
    int size; 
    int type; 
    T data; 
}; 

같은과 (등등 문자열에 대한 같은) 일부 오버로드

addMessage (int value) { 
    Argument<int> *a = new Argument<int>; 
    vec.push_back(a); 
} 

내가 하나 개의 벡터로 모든 것을 밀어 시도와 간단한 템플릿을했다. 시도 :

std::vector<Argument* > vec; 
std::vector<Argument<typename T>* > vec; 
std::vector<Argument<>* > vec; 

그러나이 중 아무 것도 작동하지 않는 것 같습니다. 이것을 할 수있는 방법이 있습니까? 미리 감사드립니다.

답변

13

옵션 1 : 모든 다른 유형의 인수가 기본 클래스에서 파생되었는지 확인하고 해당 클래스에 대한 포인터를 사용하십시오. 이 옵션은 메모리 관리 측면에서 위험합니다. 포인터 대신 boost :: shared_ptr을 사용하면 더 안전하게 만들 수 있습니다. 그렇지 않으면 항목이 벡터에서 제거 될 때 수동으로 정리해야합니다.

옵션 2 (내 개인 좋아하는) : 가능한 모든 인수 형식의 형식 정의를 확인하고이를 위해 표준에서 인수 유형 : 벡터

typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType; 
std::vector<ArgumentType> vec; 
+0

템플릿이 "모든 유형"을 보유하고 있다고 생각할 때 내가 틀렸던 것처럼 보입니다. 이 프로젝트에는 Boost가 사용되지 않았으므로 아직 상속을 유지할 것입니다. thx – DaClown

+0

'std :: variant'는 C++ 17 이후부터 사용 가능합니다. http://en.cppreference.com/w/cpp/utility/variant – biowep

4

당신은 부스트 :: 변형을 사용할 수 있습니다 (http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html)
또는 부스트 : 어떤 (http://www.boost.org/doc/libs/1_38_0/doc/html/any.html) 유형

또는 무효 * - 추악한하지가
을 형태 보증 또는 하나의 인터페이스를해야합니다 자신의 제네릭 형식을 구현 다른 템플릿 구현과이 인터페이스에 포인터를 저장합니다.

하지만 비슷한 유형을 사용하는 것이 좋은 디자인인지는 잘 모르겠습니다.

6

으로 가장 쉬운 방법은 그 타입 정의를 것 사용 Boost.Variant를 사용 템플리트 화되지 않은 기본 Argument 클래스를 가져 와서 특정 데이터 유형을 파생 시키십시오. 템플릿 기반 버전을 기본 클래스에서 직접 파생시켜 두 클래스 만 사용할 수도 있습니다. 그런 다음 벡터로 포인터를 저장합니다.

이렇게하려면 인수 값에 액세스하고 필요에 따라 변환을 수행하는 일종의 함수가 있어야합니다.

관련 문제