2013-04-12 2 views
0

실제 데이터를 인코딩하고 디코딩해야하는 일부 데이터 형식에 해당하는 일부 클래스가 있습니다. 예 : class MyInt32은 정수 값을 인코딩하고 인코딩 된 바이트 스트림에서 디코딩하는 기능을 갖습니다. 이 모든 클래스는 기본 클래스 MyTypes에서 파생됩니다. 디코딩하는 동안 인코딩 된 문자열에서 값을 가져온 후 MyInt의 경우 int과 같은 값을 입력하고 데이터를 void *으로 반환합니다.런타임 형식 ID를 사용하여 void 포인터에서 데이터 가져 오기

수신 측에서는 포인터를 (int *)에 입력하고 역 참조하여 결과에 넣습니다.

하지만 이제 배열이 필요한 유형이 필요합니다. 배열의 경우 템플릿을 사용하여 배열의 내용을 말합니다. . 즉, 디코드 기능에서

template<typename T> 
class MyArray:public MyType 
{ 
    vector<T *> mydata; 
    .... 
}; 

가 나는 T 형식의 디코드를 호출하지만 지금은 단지 void* 반환합니다. 내 배열 디코딩 된 형식을 알 수 없습니다. 그래서 void *을 타입 변환 할 수 없으며 값을 얻기 위해 역 참조 할 수 없습니다. 내가 MyInt

MyArray<MyInt> data; 

배열 'data'의 배열을 가지고가는 경우에 그 , 자사의 디코딩 결과가 vector<int> 될 것이라는 점을 알 수 없습니다. 그리고 vector<int*> 대신 데이터를 vector<int>으로 전달하는 것이 좋습니다. 어떻게해야합니까?

답변

3

확인 (등 MyInt) 템플릿 인수로 사용할 수있는 각 유형은 RepresentedType으로 주어진 이름을 가진 typedef,이 있는지 : 당신은 템플릿 클래스에서 사용할 수 있습니다 지금

class MyInt : public MyType { 
public: 
    typedef int RepresentedType; 
    .... 
}; 

를 :

template<typename T> 
class MyArray : public MyType { 
    .... 
    T::RepresentedType * something(); 
}; 

는 (나는 이것이 당신이 원하는 무엇인가를 바란다.) 당신이 부스트 :: 당신의 목적을 위해 어떤 클래스를 사용할 수 있습니다

1

. 런타임 유형 식별을 기반으로 저장된 데이터 의 가치를 얻는 것은 쉽고 효율적인 방법입니다.

vector<boost::any> somevec; 
boost::any obj= new MyClass<SomeTemplate>; 
somevec.push_back(obj); 

SomeTemplate ret = boost::any_cast<SomeTemplate>(somevec[0]);