#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;
}