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



我有一些对应于某些数据类型的类,它们应该编码和解码实际数据。例如,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]);

最新更新