fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. template <int T>
  5. class E
  6. {
  7. public:
  8. template <typename ... ArgTypes>
  9. class Base
  10. {
  11. public:
  12. void operator()(ArgTypes ... args)
  13. {
  14. On(nullptr, args...);
  15. }
  16. virtual void On(Base<ArgTypes...>*, ArgTypes...) = 0;
  17. };
  18. };
  19.  
  20. class A : public E<0>::Base<int>
  21. , public E<1>::Base<int>
  22. {
  23. public:
  24.  
  25. void On(E<0>::Base<int>*, int val) override
  26. {
  27. std::cout << "E<0>::Base<int> called: " << val << std::endl;
  28. }
  29.  
  30. void On(E<1>::Base<int>*, int val) override
  31. {
  32. std::cout << "E<1>::Base<int> called: " << val*val << std::endl;
  33. }
  34. };
  35.  
  36. int main() {
  37. std::shared_ptr<A> a = std::make_shared<A>();
  38. a->E<0>::Base<int>::operator()(2);
  39. a->E<1>::Base<int>::operator()(2);
  40.  
  41. return 0;
  42. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
E<0>::Base<int> called: 2
E<1>::Base<int> called: 4