模板中的pimpl-idiom; 哪个智能指针?

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)

ds2*_*680 13

很久以后Herb Sutter再次开始写他的GotWs.其中一个新的与"编译防火墙"有关.

你可能想看看:

GotW#100:编译防火墙(难度:6/10)

GotW#101:编译防火墙,第2部分(难度:8/10)


Jam*_*nze 1

boost::shared_ptr除了在实例化点(对于 pimpl 而言,在构造函数中)之外,不需要完整的定义。 boost::shared_ptr然而,它适合 pimpl 习惯用法,因为它给出了非常意想不到的语义(赋值或复制的参考语义);如果您确实想要增加智能指针的复杂性,boost::scoped_ptr会更合适(但在实例化其析构函数时确实需要完整的定义)。

对于模板,使用 pimpl 习惯用法来获取标头中的实现细节是没有意义的。如果没有export,类模板的所有实现细节都必须包含在使用模板的任何地方,因此 pimpl 习惯用法背后的动机就不复存在了。