9

我想构造一条长度或参数数量未知的消息。我拿了一个简单的模板,比如

template <typename T> class Argument {
public:
    int size;
    int type;
    T data;
};

并且有一些重载

addMessage (int value) {
    Argument<int> *a = new Argument<int>;
    vec.push_back(a);
}

(对于字符串等也是如此)我尝试将其全部推入一个向量中。我试过

std::vector<Argument* > vec;
std::vector<Argument<typename T>* > vec;
std::vector<Argument<>* > vec;

但这似乎没有任何作用。有没有办法做到这一点?提前致谢。

4

3 回答 3

14

选项 1:确保所有不同类型的参数都派生自基类并使用指向该类的指针。请注意,此选项在内存管理方面存在风险。您可能希望通过使用 boost::shared_ptr 而不是指针来使其更安全。否则,当从向量中删除项目时,您必须手动清理。

选项 2(我个人最喜欢的):使用Boost.Variant生成所有可能参数类型的 typedef,并将该 typedef 用作 std::vector 中的参数类型

typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType;
std::vector<ArgumentType> vec;
于 2009-03-30T08:30:14.227 回答
6

最简单的方法是创建一个未模板化的基本 Argument 类,然后从它派生特定的数据类型。(您甚至可以使模板化版本直接从基类派生并只使用这两个类。)然后将它们作为指针存储在向量中。

这确实需要某种函数来访问参数值并根据需要执行任何转换。

于 2009-03-30T08:31:13.630 回答
5

您可以使用 boost::variant ( http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html )
或 boost::any ( http://www.boost.org/doc/ libs/1_38_0/doc/html/any.html ) 类型

或 void* - 丑陋且非类型安全
或实现自己的泛型类型,该类型将具有一个接口和不同的模板化实现,并将指针存储在该接口上。

但我不确定使用类似类型是否是好的设计。

于 2009-03-30T08:28:50.313 回答