如何将不同的模板类型放入一个向量中

时间:2009-03-30 08:26:27

标签: c++ templates polymorphism

我想构造一个长度或数量未知的消息。我拿了一个像

这样的简单模板
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;

但这似乎没有任何效果。有没有办法做到这一点?提前谢谢。

3 个答案:

答案 0 :(得分:13)

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

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

中的参数类型
typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType;
std::vector<ArgumentType> vec;

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

你可以使用 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)类型

或无效* - 丑陋而不是类型安全的 或实现自己的泛型类型,它将具有一个接口和不同的模板化实现,并将指针存储在此接口上。

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