3

假设我有一个模板类

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

谢谢 !

4

2 回答 2

3

这个问题的唯一答案是“滚动你自己的已经存在于 Boost 中的类”,不管你喜欢ptr_vector, shared_ptr,any等等。他们已经拥有了这方面的所有基础。选择你最喜欢的并推出你自己的实现,然后使用它。

编辑:一位评论者提到了 TR1。好喊。TR1 里面有shared_ptr

于 2011-07-09T22:18:50.907 回答
1

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

于 2011-07-09T22:14:23.253 回答