【问题标题】:Getting data from a void pointer using run time type identification使用运行时类型识别从 void 指针获取数据
【发布时间】:2013-04-12 04:21:30
【问题描述】:

我有一些类对应于一些应该对实际数据进行编码和解码的数据类型。例如, class MyInt32 将具有对整数值进行编码并从编码字节流中对其进行解码的功能。 所有这些类都派生自一个基类MyTypes。解码时,从编码中获取值后 字符串 我将值放在相应的数据类型中,例如int,如果是MyInt,并将数据作为void *返回。

在 接收端,我将指针类型转换为(int *),然后取消引用它以将其放入结果中。

但现在我也需要一个类型来拥有数组。在数组的情况下,我使用模板来说明数组的内容 举行。也就是说,

template<typename T>
class MyArray:public MyType
{
    vector<T *> mydata;
    ....
};

在解码函数中,我将调用类型 T 的解码。但现在它只返回一个void*。我的阵列不会知道 解码的类型是什么。所以我不能对void * 进行类型转换并取消引用它来获取值。那是, 如果我取MyInt的数组

MyArray<MyInt> data;

数组'data'不会知道它的解码结果是vector&lt;int&gt;。最好将数据传递为vector&lt;int&gt; 而不是vector&lt;int*&gt; 我怎样才能实现它?

【问题讨论】:

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


    【解决方案1】:

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

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

    现在你可以在模板类中使用它了:

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

    (我希望这是你想要的。)

    【讨论】:

      【解决方案2】:

      你可以使用 boost::any 类来达到你的目的。这是获得任何价值的简单有效的方法 基于运行时类型标识存储的数据。

      vector<boost::any> somevec;
      boost::any obj= new MyClass<SomeTemplate>;
      somevec.push_back(obj);
      
      SomeTemplate ret = boost::any_cast<SomeTemplate>(somevec[0]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-01
        • 2012-03-19
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        相关资源
        最近更新 更多