试想一个典型PIMPL方法的实现:如何实现与PIMPL方法逻辑常量性
class ObjectImpl;
class Object
{
Object(ObjectImpl* object_impl)
: _impl(object_impl);
private:
ObjectImpl* _impl;
};
我正在寻找一种方法可以重复使用相同的实现包装类型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中*。
它基本上只是这一招从斯科特迈尔斯有效的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应该是一个实现细节,在类的接口中是不可见的。 –
这个构造函数可能是私人的内部用途 –