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

DaC*_*own 9 c++ polymorphism templates

我想构造一个长度或数量未知的消息.我拿了一个简单的模板

template <typename T> class Argument {
public:
    int size;
    int type;
    T data;
};
Run Code Online (Sandbox Code Playgroud)

并有一些超载

addMessage (int value) {
    Argument<int> *a = new Argument<int>;
    vec.push_back(a);
}
Run Code Online (Sandbox Code Playgroud)

(对于字符串等相同)我尝试将它全部推入一个向量.我试过了

std::vector<Argument* > vec;
std::vector<Argument<typename T>* > vec;
std::vector<Argument<>* > vec;
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*oît 14

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

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

typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType;
std::vector<ArgumentType> vec;
Run Code Online (Sandbox Code Playgroud)


Dae*_*min 6

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

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


bay*_*yda 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 *-难看且不是类型安全的,
或实现自己的通用类型,该通用类型将具有一个接口和不同的模板实现,并将指针存储在此接口上。

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