fork(2) download
  1. class Base {
  2. public:
  3.  
  4. template<typename Outer>
  5. class Thing {
  6. public:
  7. Thing(Base& b) : _b(b) {};
  8.  
  9. Thing& operator+= (const Thing p) { _b.add(*this, p); return *this; };
  10.  
  11. int k;
  12. protected:
  13. Outer& _b;
  14. };
  15.  
  16. template<typename Outer>
  17. void add(Thing<Outer> &d, const Thing<Outer> s) { d.k += s.k; }
  18. };
  19.  
  20. template <class... Interfaces>
  21. class Extensible : virtual public Base, virtual public Interfaces... {
  22.  
  23. class Thing : virtual public Base::Thing<Base>, virtual public Interfaces::template Thing<Base>... {
  24.  
  25. };
  26. };
  27.  
  28. class SomeInterface : Base {
  29. void multiply(Thing<SomeInterface> &d, const Thing<SomeInterface> s) { d.k *= s.k; }
  30.  
  31. class Thing : public Base::Thing<SomeInterface> {
  32. Thing& operator*= (const Thing p) {
  33. _b.multiply(*this, p); return *this; // <-- won't work of course
  34. };
  35.  
  36. };
  37.  
  38. };
  39.  
  40. int main() {
  41. Extensible<SomeInterface> a;
  42. return 0;
  43. }
  44.  
Success #stdin #stdout 0s 3336KB
stdin
Standard input is empty
stdout
Standard output is empty