我想构造一个长度或数量未知的消息。我拿了一个像
这样的简单模板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;
但这似乎没有任何效果。有没有办法做到这一点?提前谢谢。
答案 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)类型
或无效* - 丑陋而不是类型安全的 或实现自己的泛型类型,它将具有一个接口和不同的模板化实现,并将指针存储在此接口上。
但我不确定使用类似的类型是不错的设计。