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

Doing type erasure safely without boost and c++0x

本文关键字:安全 擦除 类型 情况下 boost c++0x      更新时间:2023-10-16

假设我有一个模板化的类

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实例的指向A_base的指针。用new这样做可能会引起内存泄漏和/或异常不安全,所以解决这个问题的合理方法是使用boost::shared_ptr或std::tr1::shared_ptr,因为复制std::auto_ptr可能会导致所有权问题和未定义的行为!

是否有任何方法做类型擦除不包括boost或c++0x依赖?:)

谢谢!

这个问题的唯一答案是"滚动你自己的类,已经存在于Boost",无论你喜欢ptr_vector, shared_ptr, any等。在这方面,他们已经做好了一切准备。选择你最喜欢的,并推出你自己的实现,然后使用它。

编辑:一位评论者提到了TR1。好大声。TR1中有shared_ptr

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