odi*_*erd 6 c++ templates boost pimpl-idiom scoped-ptr
我通常对pimpl使用boost :: scoped_ptr(出于一个原因,因为如果我忘记处理复制构造函数,我就不会感到惊讶)
但是,使用模板,我不能将析构函数放在完全定义impl的cpp文件中,以满足scoped_ptr析构函数的要求.无论如何它确实有效,但我不确定它是否能够保证工作或只是偶然.有一些"最佳实践"或标准吗?scoped_ptr是非可复制类中pimpls的最佳智能指针吗?
template <class T> class C {
public:
C(){}
~C(){}
private:
boost::scoped_ptr<T> pimpl_;
};
Run Code Online (Sandbox Code Playgroud)
boost::shared_ptr除了在实例化点(对于 pimpl 而言,在构造函数中)之外,不需要完整的定义。 boost::shared_ptr然而,它不适合 pimpl 习惯用法,因为它给出了非常意想不到的语义(赋值或复制的参考语义);如果您确实想要增加智能指针的复杂性,boost::scoped_ptr会更合适(但在实例化其析构函数时确实需要完整的定义)。
对于模板,使用 pimpl 习惯用法来获取标头中的实现细节是没有意义的。如果没有export,类模板的所有实现细节都必须包含在使用模板的任何地方,因此 pimpl 习惯用法背后的动机就不复存在了。