在没有boost和c++0x的情况下安全地进行类型擦除
Doing type erasure safely without boost and c++0x
假设我有一个模板化的类
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
等。在这方面,他们已经做好了一切准备。选择你最喜欢的,并推出你自己的实现,然后使用它。
shared_ptr
看一下boost/any.hpp。我做到了。
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- C++ 擦除函数中需要澄清
- 循环挂起迭代的 std::擦除 on std::list
- 擦除许多矢量元素,同时使用'auto'
- 如何擦除冗余输入?
- C++ STL 设置按值擦除
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 从容器中移动unique_ptr并擦除它是安全的吗?
- 在单个链表中擦除和插入线程安全吗
- std::vector::擦除异常安全
- 线程安全 TBB::concurrent_hash_map擦除
- 什么是非空STL擦除的安全等价物