我可以使用任何黑客来做到这一点:
template <class TYPE>
class Hello
{
TYPE _var;
};
我想要一种存储方式
Hello<int> intHello and Hello<char*> charHello
进入同一个容器,例如队列/列表。
答案 0 :(得分:10)
不,因为它们是不同的,完全不相关的类型。
但是,您可以使用继承和智能指针:
class HelloBase
{
public:
virtual ~HelloBase();
}
template <class TYPE>
class Hello : public HelloBase
{
TYPE _var;
}
std::vector<boost::shared_ptr<HelloBase> > v;
您的实施可能会在shared_ptr
或std::tr1
命名空间中支持 std
;你必须检查。
答案 1 :(得分:5)
是的,有点 - 但你可能不想。即使它们从同一模板开始,Hello<int>
和Hello<char *>
也是完全独立且不相关的类型。包含两者的集合是异构的,包含所有需要的问题。
如果你坚持这样做,为了合理地干净利落,你通常会创建类似Boost::any
的队列/列表。
答案 2 :(得分:4)
首先,真正的问题是:你想要达到的目标(更高层次)?
现在,对于这个特殊问题,有许多替代方案。容器无法存储异构数据,因此您可以:
Hello<T>
提供一个公共基类并添加虚拟方法,然后使用指针,处理内存所有权(unique_ptr
或boost::ptr_list
会很棒)boost::variant
,它会被静态检查,以便您有合理的保证boost::any
封面在这种情况下,常见的基类是常用方法。如果没有理由拥有多态性,那么最好使用variant
,如果没有别的any
。