我想构造一个长度或数量未知的消息.我拿了一个简单的模板
templateclass Argument { public: int size; int type; T data; };
并有一些超载
addMessage (int value) { Argument*a = new Argument ; vec.push_back(a); }
(对于字符串等相同)我尝试将它全部推入一个向量.我试过了
std::vectorvec; std::vector * > vec; std::vector * > vec;
但这似乎没有任何作用.有没有办法做到这一点?提前致谢.
选项1:确保所有不同类型的参数都派生自基类并使用指向该类的指针.请注意,此选项在内存管理方面存在风险.您可能希望通过使用boost :: shared_ptr而不是指针来使其更安全.否则,必须在从矢量中删除项目时手动清理.
选项2(我个人最喜欢的):使用Boost.Variant生成所有可能的参数类型的typedef,并使用该typedef作为std :: vector中的参数类型
typedef boost::variantArgumentType; std::vector vec;
最简单的方法是使用一个基本的Argument类,它不是模板化的,然后从中派生出特定的数据类型.(您甚至可以使模板化版本直接从基类派生,只使用这两个类.)然后将它们存储为向量中的指针.
这确实需要某种函数来访问参数值并根据需要执行任何转换.
您可以使用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 *-难看且不是类型安全的,
或实现自己的通用类型,该通用类型将具有一个接口和不同的模板实现,并将指针存储在此接口上。
但是我不确定使用类似的类型是否是好的设计。