如何轻松覆盖多个重载的方法?
假设我有一个接口和一个实现它的类,如下所示:
class IPrinter
{
public:
virtual void print(int i, int base = 10) = 0;
virtual void print(char c) = 0;
virtual void print(char *s) = 0;
virtual void print(float f) = 0;
virtual void print(double d) = 0;
virtual ~IPrinter() = default;
private:
...
}
class Printer : public IPrinter
{
public:
void print(int i, int base = 10) override {...}
void print(char c) override {...}
void print(char *s) override {...}
void print(float f) override {...}
void print(double d) override {...}
private:
...
}
然后我决定添加一个简单的装饰类,如下所示:
class SwitchablePrinter : public IPrinter
{
private:
IPrinter& _printer;
bool _enabled;
...
public:
SwitchablePrinter(IPrinter& p) :
_printer(p),
_enabled(true)
{
}
void print_enable(bool on) { _enabled = on; }
void print(int i, int base = 10) override
{
if (_enabled)
_printer.print(i, base);
}
void print(char c) override
{
if (_enabled)
_printer.print(c);
}
void print(char *s) override
{
if (_enabled)
_printer.print(s);
}
void print(float f) override
{
if (_enabled)
_printer.print(f);
}
void print(double d) override
{
if (_enabled)
_printer.print(d);
}
}
现在,这一切都非常简单直接。 问题是SwitchablePrinter实现中有很多代码重复。 我想知道,如果有一种方法为基类中的所有重载方法编写泛型方法'print',如下所示:
(pseudo-code)
void print({any args})
{
if (_enabled)
_printer.print({any args});
}
我认为可能有使用模板的解决方案,但我对使用它们并不需要经验丰富,需要建议。
虽然没有机制可以一次覆盖多个成员函数,但可以通过提供私有可变成员函数模板来简化任务并减少代码重复,该模板将调用转发给包装的_printer
的正确重载,如下所示:
private:
template <class ... T>
void print_impl(T ... vals) {
if (_enabled)
_printer.print(vals...);
else
cout << "disabled" << endl;
}
public:
void print(int i, int r) override {
print_impl(i, r);
}
void print(float f) override {
print_impl(f);
}
void print(double d) override {
print_impl(d);
}
void print(char* s) override {
print_impl(s);
}
void print(char c) override {
print_impl(c);
}
演示。
这只是对原文的轻微改进,因为print_impl
的转发逻辑非常简单。 当逻辑变得更复杂时,共享代码的收益会增加。
显而易见的是要用SwitchablePrinter替换实现
template<typename T>
void print(T t) override
{
if (_enabled)
_printer.print(t);
}
(忽略整数印刷方法存在问题。)
但是这不起作用,因为成员函数模板不能是虚拟的:C ++类成员函数模板可以是虚拟的吗? (请参阅最高评价的答案,而不是接受的答案。)因此,就目前我看来,您当前的SwitchablePrinter实施方案是最好的。
链接地址: http://www.djcxy.com/p/88363.html上一篇: How to easily override multiple overloaded methods?
下一篇: Xcode 7 crash every time I try to print something in the debugger console