繁体   English   中英

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

[英]Getting data from a void pointer using run time type identification

我有一些类对应于一些应该对实际数据进行编码和解码的数据类型。 例如, class MyInt32将具有编码整数值并从编码字节流中对其进行解码的功能。 所有这些类都是从基类MyTypes 解码时,从编码字符串中获取值后,我将该值放入相应的数据类型中,例如在MyInt情况下为int ,并将数据返回为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*>传递。如何实现?

确保每个可用作模板参数的类型( MyInt等)都具有给定名称的typedef ,例如RepresentedType

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

现在,您可以在模板化类中使用它:

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

(我希望这就是您想要的。)

您可以使用boost :: any类用于您的目的。 这是一种基于运行时类型标识来获取任何存储数据值的简便有效的方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM