【发布时间】:2012-01-13 06:18:32
【问题描述】:
我通常对 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_;
};
【问题讨论】:
-
这种 PIMPL 实现没有任何意义,因为要实例化 C 模板,您必须了解类型 T。另一方面,PIMPL 对用户完全隐藏了 T 的等价物.
-
@VladLazarenko 嗯,我认为 boost::scoped_ptr 在预先声明的类上也能正常工作。在这种情况下,它取决于 T 是定义的还是预先声明的。这个 scoped_ptr 的实例化将隐藏在实现中 (pimpl_(new T())。
-
@DavidFeurle:不是真的,为了让这个模板工作,
T的大小,以及它的接口,必须暴露,因为“客户”需要实例化模板。例如,您在哪里拨打new T()?您不能将其隐藏在“cpp”文件中,因为它必须在模板中。所以它不是 PIMPL。 -
@Vlad Lazarenko 好点。我知道我在哪里犯了错误以及它为什么会起作用
-
所以看起来在这种情况下,因为无论如何我都必须定义 T,所以我只能将其设为私有成员以节省成本。
标签: c++ templates boost pimpl-idiom scoped-ptr