C++ Generic wrapper class 为某些函数添加了额外的处理
C++ Generic wrapper class which adds extra processing for some functions
我正在尝试为遗留继承层次结构创建一个包装器 class,它不是严格意义上的多态的。在包装器 class 中,我为一些方法添加了额外的功能,但对于许多其他方法,我只想调用包装的 class 方法。
我想知道是否有一种方法可以在包装器 class 中编写通用包装器函数,这样我就可以像没有包装器一样以正常方式调用包装器函数 class。
可能是我错了,但我不认为重载 operator-> 会起作用,因为包装的 class 有一些方法,我想在调用包装的 class 函数(尽管对于许多其他函数,我不需要这样做)。
我还查看了 Herb Sutter 的包装器模式(同样,我可能是错的),但这需要我有一个 lambda 来访问包装函数。
我想知道是否有人对这是否可以实现有任何想法?
我已经把代码放在@ cpp.sh/2ombu
这里代替
wrapper->operator()([](Derived& x)
{
x.print();
});
或
wrapper->operator->()->print();
有没有办法让我拥有
wrapper->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
声明。如果你现在问:"Why not inherit publicly, then I don't have to?",那么请考虑以下问题:
Wrapped* w = new Wrapper();
w->f(); //Wrapped's version of f will be called, as f in given example is not virtual!
也许你会说 "I won't ever use Wrapped
directly."。那会成功,但是仍然在某个地方使用它然后出现错误的危险仍然存在 public 继承...
你的问题是你实际上使用了指针。
目前,而不是
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,它不是严格意义上的多态的。在包装器 class 中,我为一些方法添加了额外的功能,但对于许多其他方法,我只想调用包装的 class 方法。
这里代替
wrapper->operator()([](Derived& x)
{
x.print();
});
或
wrapper->operator->()->print();
有没有办法让我拥有
wrapper->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
声明。如果你现在问:"Why not inherit publicly, then I don't have to?",那么请考虑以下问题:
Wrapped* w = new Wrapper();
w->f(); //Wrapped's version of f will be called, as f in given example is not virtual!
也许你会说 "I won't ever use Wrapped
directly."。那会成功,但是仍然在某个地方使用它然后出现错误的危险仍然存在 public 继承...
你的问题是你实际上使用了指针。
目前,而不是
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();
});