- #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==