我有一些对应于某些数据类型的类,它们应该编码和解码实际数据。例如,class MyInt32
将具有编码整数值并从编码字节流解码它的功能。所有这些类都派生自一个基类MyTypes
。在解码时,从编码的值中获取值后我将值放在相应的数据类型中,例如MyInt
中的int
,并将数据作为void *
返回。
在接收端,我将指针类型转换为(int *)
,然后对其解引用,将其放入结果中。
但是现在我还需要一个数组类型。对于数组,我使用模板来说明数组的运行情况持有。也就是说,
template<typename T>
class MyArray:public MyType
{
vector<T *> mydata;
....
};
在decode函数中,我将调用t类型的decode,但现在它只返回一个void*
。我的数组不会知道解码后的类型是什么。所以我不能对void *
进行类型转换并对其解引用以获得值。也就是说,如果我取一个数组MyInt
MyArray<MyInt> data;
数组' data
'不知道它的解码结果将是vector<int>
。并且最好将数据传递为vector<int>
而不是vector<int*>
我怎样才能实现它?
确保每个可以用作模板参数的类型(MyInt
等)都有一个具有给定名称的typedef
,例如RepresentedType
:
class MyInt : public MyType {
public:
typedef int RepresentedType;
....
};
现在你可以在模板类中使用它了:
template<typename T>
class MyArray : public MyType {
....
T::RepresentedType * something();
};
(I hope this is you want .)
您可以使用boost::any类。这是获取任意值的简单而有效的方法根据运行时类型标识存储数据。
vector<boost::any> somevec;
boost::any obj= new MyClass<SomeTemplate>;
somevec.push_back(obj);
SomeTemplate ret = boost::any_cast<SomeTemplate>(somevec[0]);