当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将不同的模板类型放入一个向量中》经验,为你挑选了3个好方法。

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

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

并有一些超载

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

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

std::vector vec;
std::vector* > vec;
std::vector* > vec;

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



1> Benoît..:

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

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

typedef boost::variant ArgumentType;
std::vector vec;



2> Daemin..:

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

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



3> bayda..:

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

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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有