我有一些类对应于某些数据类型,它们应该对实际数据进行编码和解码。例如,
class MyInt32
将具有编码整数值并从编码字节流解码的功能。
所有这些类都派生自基类MyTypes
。在解码后,从编码后获取值
string我将值放在相应的数据类型中,例如int
MyInt
,并将数据作为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*>
传递
我怎样才能实现它?
答案 0 :(得分:3)
确保可用作模板参数(MyInt
等)的每种类型都有一个具有给定名称的typedef
,例如RepresentedType
:
class MyInt : public MyType {
public:
typedef int RepresentedType;
....
};
现在您可以在模板化类中使用它:
template<typename T>
class MyArray : public MyType {
....
T::RepresentedType * something();
};
(我希望这是你想要的。)
答案 1 :(得分:1)
你可以使用boost :: any类来达到你的目的。这是获得任何价值的简单而有效的方式 存储的数据基于运行时类型标识。
vector<boost::any> somevec;
boost::any obj= new MyClass<SomeTemplate>;
somevec.push_back(obj);
SomeTemplate ret = boost::any_cast<SomeTemplate>(somevec[0]);