假设我有一个C ++接口
class Iface
{
public:
virtual ~Iface () {}
virtual void foo () = 0;
virtual void bar () = 0;
};
我有一些类需要在一侧公开它并在其他地方实现它。我发现很常见的是我最终在中间有一堆类,基本上是这样的:
class InTheMiddleSomewhere
: public Iface // amongst other things
{
public: // Iface
virtual void foo () { if (impl) impl->foo (); }
virtual void bar () { if (impl) impl->bar (); }
private:
IfaceImpl* impl;
};
随着界面的扩展,扩散和变化,编写和维护变得令人厌烦。
问:对于完整的接口实现传递是否有更好的(或多或少自动)方式,而不是手动编写所有“if(impl)impl-> ...”的东西?答案 0 :(得分:1)
您可以将调用绑定到函数对象,然后只传递函数对象(而不是为接口的每个成员函数进行委托调用)。
请考虑以下事项:
struct I
{
virtual R1 f1(A1, B1, ..., Z1) = 0;
virtual R2 f2(A2, B2, ..., Z2) = 0;
.
.
virtual Rn fn(An, Bn, ..., Zn) = 0;
};
现在我有一些I的实现:
struct : I
{
...
} x, y, z;
所以我可以调用x,y和zs函数,如:
Ri xri = x.fi(ai, bi, ..., zi);
Ri yri = y.fi(ai, bi, ..., zi);
Ri zri = z.fi(ai, bi, ..., zi);
或者我可以将调用绑定到I接口的方法,如下所示:
function<Ri(I&)> g = bind(&I::fi, _1, ai, bi, ..., zi);
然后再说:
Ri xri = g(x);
Ri yri = g(y);
Ri zri = g(z);
即使x,y和z是不同的类,只要它们来自I。
,这都有效答案 1 :(得分:0)
我认为这是使用句柄类(Pimpl idiom)的一个缺点。是否绝对需要保持编译时间以支持违反开放/封闭原则?通常使用今天的编译器和CPU,Pimpl习惯用法的用法不像以前那么多。