C++泛型包装类,它为某些函数添加了额外的处理



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

我想知道是否有一种方法可以在包装类中编写一个通用的包装函数,这样我就可以像没有包装类一样以正常的方式调用包装函数。 也许我错了,但我不认为重载运算符->会起作用,因为包装类有一些方法,我想在调用包装类函数之前对它们进行一些处理(尽管对于许多其他方法,我不需要这样做(。 我还查看了Herb Sutter的包装器模式(同样,我可能错了(,但这需要我有一个lambda来访问包装的函数。 我想知道是否有人知道这是否可以实现?

我在这里放置了代码@cpp.sh/2ombu
而不是
wrapper->operator()([](Derived& x)
{
x.print();
});

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

有什么方法可以给我吗

wrapper->print();

提前感谢您的回答。。

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

目前,不是

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();
});

并没有给你想要的结果,但仍然相对便宜(从需要编写的代码的意义上来说(:继承:

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。">。这是可行的,但仍然在某个地方使用它,然后出现错误的危险仍然存在于公共继承中。。。

最新更新