【发布时间】:2016-09-16 09:37:57
【问题描述】:
想象一下 PIMPL 习语的典型实现:
class ObjectImpl;
class Object
{
Object(ObjectImpl* object_impl)
: _impl(object_impl);
private:
ObjectImpl* _impl;
};
我正在寻找的是一种重用相同实现来包装类型 T 的方法,该类型 T 可以是 ObjectImpl 或 const ObjectImpl 但仅此而已:
class ObjectImpl;
class Object
{
Object(T* object_impl)
: _impl(object_impl);
private:
// T being either ObjectImpl or const ObjectImpl
T* _impl;
};
我想要实现的是通过 PIMPL 接口保持逻辑常量,这样编译器就不允许我在包装 const ObjectImpl* 的对象上调用非常量方法。
它基本上只是从 Scott Meyers 的一本 Effective C++ 书籍中借来的这个技巧,但增加了抽象层:
struct SData
{
const Data* data() const { return _data; }
Data* data() { return _data; }
private:
Data* _data:
};
当然,我可以将整个类复制到一个类 ConstObject 中,并让它包装一个 const* Object 而不是 Object*,但我显然是在试图防止代码重复。
我也考虑过模板,但对于手头的任务来说,它们似乎有点矫枉过正。一方面,我希望 T 只能是 ObjectImpl 或 const ObjectImpl。其次,当导出为 DLL 接口时,模板似乎与 PIMPL 的想法背道而驰。有更好的解决方案吗?
【问题讨论】:
-
在构造函数中采用实现指针的 PIMPL 没有什么典型之处。 PIMPL 应该是一个实现细节,在类的接口上是不可见的。
-
该构造函数可以是私有的,用于内部目的
标签: c++11 constants pimpl-idiom