比方說,我有一個接口,並實現它的一類,像這樣:如何輕鬆覆蓋多個重載方法?
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實現中有很多代碼重複。我在想,如果有是寫在基類中的所有重載方法的通用方法「打印」,像這樣的方式:
(pseudo-code)
void print({any args})
{
if (_enabled)
_printer.print({any args});
}
我覺得有可能是使用模板的解決方案,但我對使用它們並不很熟練,需要建議。
不,沒有。你的代碼也不會如你所願,你需要在打印機中添加虛擬來覆蓋功能。 你可以使用boost :: variant和一個函數來代替所有的重載。 –
@KlemensMorgenstern,「你需要在打印機中添加虛擬」不,不是。 – SingerOfTheFall
嗯,由於重寫,你可以跳過虛擬?很好,我不知道。 –