C ++通用包装器类,为某些功能添加了额外的处理

时间:2018-07-25 12:37:22

标签: c++ c++11 c++14 generic-programming

我正在尝试为旧版继承层次结构创建包装类,该继承类并非严格多态的。在包装器类中,我为一些方法添加了额外的功能,但对于其他许多方法,我只想调用包装的类方法。

我想知道是否存在一种方法可以在包装器类中编写通用包装器函数,从而使我可以像没有包装器类一样以正常方式调用包装器函数。

可能是我错了,但是我不认为重载operator->会起作用,因为包装类的某些方法在调用包装类函数之前需要对其进行一些处理(尽管对于许多其他人来说,我不需要这样做)。

我还查看了Herb Sutter的包装器模式(同样,我可能是错的),但这需要我有一个lambda来访问包装的函数。

我想知道是否有人对此是否可以实现有任何想法?

我已经将代码放在{cpp.sh/2ombu
在这里代替

wrapper->operator()([](Derived& x)
{
   x.print();
});

wrapper->operator->()->print();

有什么我可以拥有的

wrapper->print();

预先感谢您的回答。

2 个答案:

答案 0 :(得分:4)

您的问题是您实际上使用了指针。

当前,而不是

wrapper->operator->()->print();

您可能会写

(*wrapper)->print();

如果替换不需要的指针

wrap<Derived> *wrapper = new wrap<Derived>(der);

作者

wrap<Derived> wrapper(der);

然后,您可以替换

wrapper->operator->()->print();

作者

wrapper->print();
// or wrapper.operator->()->print(); :)

以同样的方式

wrapper->operator()([](Derived& x)
    {
       x.print();
    });

将成为

wrapper(([](Derived& x)
    {
       x.print();
    });

答案 1 :(得分:2)

不能完全给您想要的结果,但是相对便宜(就需要编写的代码而言):继承:

class Wrapped
{
public:
    void f();
    void g();
};

class Wrapper : private Wrapped
{
public:
    // replacing Wrapped's f with own variant:
    void f() { pre(); Wrapped::f(); post(); };
    // pulling Wrapped's g into public  domain again:
    using Wrapped::g;
};

因此,您要做的就是添加相应的using声明。如果您现在问:“为什么不公开继承,那么我不必这么做?” ,然后考虑以下事项:

Wrapped* w = new Wrapper();
w->f(); //Wrapped's version of f will be called, as f in given example is not virtual!

也许您说“我永远不会直接使用Wrapped。” 。可以解决,但是在公共继承中仍然存在仍然存在的危险……