我通常使用一个boost :: scoped_ptr的为平普尔的(原因之一,因为那时我没有得到的惊喜,如果我忘了处理拷贝构造函数)模板中的pimpl-idiom;哪个智能指针?
有了模板,但我不能只是把析构函数为了满足scoped_ptr析构函数的要求,impl被完全定义的cpp文件。无论如何它确实有效,但我不确定它是否可以保证工作或偶然。有一些'最佳实践'或标准吗? scoped_ptr是不可复制类中pimpls的最佳智能指针吗?
template <class T> class C {
public:
C(){}
~C(){}
private:
boost::scoped_ptr<T> pimpl_;
};
这种PIMPL实现没有任何意义,因为为了实例化C模板,您必须知道类型T. PIMPL另一方面完全隐藏了用户的T等价物。 – 2011-12-05 14:11:31
@VladLazarenko嗯,我认为boost :: scoped_ptr也适用于预先声明的类。在这种情况下,它取决于T是否被定义或预先声明。这个scoped_ptr的实例将隐藏在实现中(pimpl_(new T())。 –
@DavidFeurle:实际上,为了使这个模板起作用,'T'的大小以及它的接口必须是因为“客户端”需要实例化模板,例如,你在哪里调用'new T()'?你不能将它隐藏在“cpp”文件中,因为它必须在模板中,所以它不是PIMPL – 2011-12-05 14:19:20