0

我有一些类对应于一些应该对实际数据进行编码和解码的数据类型。例如, 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<int>. 最好将数据传递为vector<int>而不是vector<int*> 如何实现它?

4

2 回答 2

3

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

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

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

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

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

于 2013-04-12T04:29:01.033 回答
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]);
于 2013-04-12T04:36:12.857 回答