说我有一个模板类
template<class T>
class A;
template<>
class A<int>
{
public:
void print(){ std::cout << "I am an int !" << std::endl; }
};
template<>
class A<double>
{
public:
void print(){ std::cout << "I am a double !" << std::endl; }
};
现在,如果我想在同一个容器中存储A的每个可能实例,请说一个向量。
然后经典(我知道的唯一方法)是使用纯虚拟print()成员函数创建另一个类A_base,并存储指向A_base的指针,该指针初始化为A的实例。使用new执行它可能会引发内存泄漏, /或异常不安全,因此解决此问题的合理方法是使用boost :: shared_ptr或std :: tr1 :: shared_ptr,因为复制std :: auto_ptr可能会导致所有权问题和未定义的行为!
有没有办法在不包含boost或c ++ 0x依赖的情况下进行类型擦除? :)
谢谢!
答案 0 :(得分:3)
这个问题的唯一答案是“滚动你自己在Boost中已经存在的类”,无论你喜欢ptr_vector
,shared_ptr
,any
等等。他们已经拥有所有在这方面涵盖的基础。选择你喜欢的并滚动你自己的实现,然后使用它。
编辑:评论者提到了TR1。好的喊叫。 TR1中有shared_ptr
。
答案 1 :(得分:1)
看看boost / any.hpp。我做到了。