在没有boost和c ++ 0x的情况下安全地进行类型擦除

时间:2011-07-09 21:57:44

标签: c++ inheritance containers auto-ptr

说我有一个模板类

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依赖的情况下进行类型擦除? :)

谢谢!

2 个答案:

答案 0 :(得分:3)

这个问题的唯一答案是“滚动你自己在Boost中已经存在的类”,无论你喜欢ptr_vectorshared_ptrany等等。他们已经拥有所有在这方面涵盖的基础。选择你喜欢的并滚动你自己的实现,然后使用它。

编辑:评论者提到了TR1。好的喊叫。 TR1中有shared_ptr

答案 1 :(得分:1)

看看boost / any.hpp。我做到了。