#include <iostream>
using namespace std;
struct IPrinter {
virtual void print(int i, int radix = 10) = 0;
virtual void print(char c) = 0;
virtual void print(double d) = 0;
virtual ~IPrinter() = default;
};
struct Printer : public IPrinter {
void print(int i, int r) override { cout << "int " << i << ", radix " << r << endl; }
void print(char c) override { cout << "char " << c << endl; }
void print(double d) override { cout << "double " << d << endl; }
};
class SwitchablePrinter : public IPrinter {
template <class ... T>
void print_impl(T ... vals) {
if (_enabled)
_printer.print(vals...);
else
cout << "disabled" << endl;
}
public:
SwitchablePrinter(IPrinter& p) :
_printer(p),
_enabled(true)
{
}
void print_enable(bool on) { _enabled = on; }
void print(int i, int r) override {
print_impl(i, r);
}
void print(char c) override {
print_impl(c);
}
void print(double d) override {
print_impl(d);
}
private:
IPrinter& _printer;
bool _enabled;
};
int main() {
Printer p;
SwitchablePrinter sp(p);
sp.print(5, 16);
sp.print('c');
sp.print(1.5);
sp.print_enable(false);
sp.print(5, 16);
sp.print('c');
sp.print(1.5);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IElQcmludGVyIHsKICAgIHZpcnR1YWwgdm9pZCBwcmludChpbnQgaSwgaW50IHJhZGl4ID0gMTApID0gMDsKICAgIHZpcnR1YWwgdm9pZCBwcmludChjaGFyIGMpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBwcmludChkb3VibGUgZCkgPSAwOwogICAgdmlydHVhbCB+SVByaW50ZXIoKSA9IGRlZmF1bHQ7Cn07CgpzdHJ1Y3QgUHJpbnRlciA6IHB1YmxpYyBJUHJpbnRlciB7CiAgICB2b2lkIHByaW50KGludCBpLCBpbnQgcikgb3ZlcnJpZGUgeyBjb3V0IDw8ICJpbnQgIiA8PCBpICA8PCAiLCByYWRpeCAiIDw8IHIgPDwgZW5kbDsgfQogICAgdm9pZCBwcmludChjaGFyIGMpIG92ZXJyaWRlIHsgY291dCA8PCAiY2hhciAiIDw8IGMgPDwgZW5kbDsgfQogICAgdm9pZCBwcmludChkb3VibGUgZCkgb3ZlcnJpZGUgeyBjb3V0IDw8ICJkb3VibGUgIiA8PCBkIDw8IGVuZGw7IH0KfTsKCmNsYXNzIFN3aXRjaGFibGVQcmludGVyIDogcHVibGljIElQcmludGVyIHsKICAgIHRlbXBsYXRlIDxjbGFzcyAuLi4gVD4KICAgIHZvaWQgcHJpbnRfaW1wbChUIC4uLiB2YWxzKSB7CiAgICAJIGlmIChfZW5hYmxlZCkKICAgIAkgICAgIF9wcmludGVyLnByaW50KHZhbHMuLi4pOwogICAgCSBlbHNlCiAgICAJICAgICBjb3V0IDw8ICJkaXNhYmxlZCIgPDwgZW5kbDsKICAgIH0KcHVibGljOgogICAgU3dpdGNoYWJsZVByaW50ZXIoSVByaW50ZXImIHApIDogCiAgICAgICAgX3ByaW50ZXIocCksIAogICAgICAgIF9lbmFibGVkKHRydWUpIAogICAgewogICAgfQogICAgdm9pZCBwcmludF9lbmFibGUoYm9vbCBvbikgeyBfZW5hYmxlZCA9IG9uOyB9CiAgICB2b2lkIHByaW50KGludCBpLCBpbnQgcikgb3ZlcnJpZGUgewogICAgICAgIHByaW50X2ltcGwoaSwgcik7CiAgICB9CiAgICB2b2lkIHByaW50KGNoYXIgYykgb3ZlcnJpZGUgewogICAgICAgIHByaW50X2ltcGwoYyk7CiAgICB9CiAgICB2b2lkIHByaW50KGRvdWJsZSBkKSBvdmVycmlkZSB7CiAgICAgICAgcHJpbnRfaW1wbChkKTsKICAgIH0KcHJpdmF0ZToKICAgIElQcmludGVyJiBfcHJpbnRlcjsKICAgIGJvb2wgX2VuYWJsZWQ7Cn07CgppbnQgbWFpbigpIHsKCVByaW50ZXIgcDsKCVN3aXRjaGFibGVQcmludGVyIHNwKHApOwoJc3AucHJpbnQoNSwgMTYpOwoJc3AucHJpbnQoJ2MnKTsKCXNwLnByaW50KDEuNSk7CglzcC5wcmludF9lbmFibGUoZmFsc2UpOwoJc3AucHJpbnQoNSwgMTYpOwoJc3AucHJpbnQoJ2MnKTsKCXNwLnByaW50KDEuNSk7CglyZXR1cm4gMDsKfQ==