使用运行时类型标识从void指针获取数据

时间:2013-04-12 04:21:30

标签: c++ templates casting void-pointers runtime-type

我有一些类对应于某些数据类型,它们应该对实际数据进行编码和解码。例如, 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*>传递 我怎样才能实现它?

2 个答案:

答案 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]);