fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct IPrinter {
  5. virtual void print(int i, int radix = 10) = 0;
  6. virtual void print(char c) = 0;
  7. virtual void print(double d) = 0;
  8. virtual ~IPrinter() = default;
  9. };
  10.  
  11. struct Printer : public IPrinter {
  12. void print(int i, int r) override { cout << "int " << i << ", radix " << r << endl; }
  13. void print(char c) override { cout << "char " << c << endl; }
  14. void print(double d) override { cout << "double " << d << endl; }
  15. };
  16.  
  17. class SwitchablePrinter : public IPrinter {
  18. template <class ... T>
  19. void print_impl(T ... vals) {
  20. if (_enabled)
  21. _printer.print(vals...);
  22. else
  23. cout << "disabled" << endl;
  24. }
  25. public:
  26. SwitchablePrinter(IPrinter& p) :
  27. _printer(p),
  28. _enabled(true)
  29. {
  30. }
  31. void print_enable(bool on) { _enabled = on; }
  32. void print(int i, int r) override {
  33. print_impl(i, r);
  34. }
  35. void print(char c) override {
  36. print_impl(c);
  37. }
  38. void print(double d) override {
  39. print_impl(d);
  40. }
  41. private:
  42. IPrinter& _printer;
  43. bool _enabled;
  44. };
  45.  
  46. int main() {
  47. Printer p;
  48. SwitchablePrinter sp(p);
  49. sp.print(5, 16);
  50. sp.print('c');
  51. sp.print(1.5);
  52. sp.print_enable(false);
  53. sp.print(5, 16);
  54. sp.print('c');
  55. sp.print(1.5);
  56. return 0;
  57. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
int 5, radix 16
char c
double 1.5
disabled
disabled
disabled