class Base {
public:
template<typename Outer>
class Thing {
public:
Thing(Base& b) : _b(b) {};
Thing& operator+= (const Thing p) { _b.add(*this, p); return *this; };
int k;
protected:
Outer& _b;
};
template<typename Outer>
void add(Thing<Outer> &d, const Thing<Outer> s) { d.k += s.k; }
};
template <class... Interfaces>
class Extensible : virtual public Base, virtual public Interfaces... {
class Thing : virtual public Base::Thing<Base>, virtual public Interfaces::template Thing<Base>... {
};
};
class SomeInterface : Base {
void multiply(Thing<SomeInterface> &d, const Thing<SomeInterface> s) { d.k *= s.k; }
class Thing : public Base::Thing<SomeInterface> {
Thing& operator*= (const Thing p) {
_b.multiply(*this, p); return *this; // <-- won't work of course
};
};
};
int main() {
Extensible<SomeInterface> a;
return 0;
}
Y2xhc3MgQmFzZSB7CnB1YmxpYzoKICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgT3V0ZXI+CiAgICBjbGFzcyBUaGluZyB7CiAgICBwdWJsaWM6CiAgICAgICAgVGhpbmcoQmFzZSYgYikgOiBfYihiKSB7fTsKICAgICAgICAKICAgICAgICBUaGluZyYgb3BlcmF0b3IrPSAoY29uc3QgVGhpbmcgcCkgeyBfYi5hZGQoKnRoaXMsIHApOyByZXR1cm4gKnRoaXM7IH07CiAgICAgICAgCiAgICAgICAgaW50IGs7CiAgICBwcm90ZWN0ZWQ6CiAgICAgICAgT3V0ZXImIF9iOwogICAgfTsKCgl0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRlcj4KICAgIHZvaWQgYWRkKFRoaW5nPE91dGVyPiAmZCwgY29uc3QgVGhpbmc8T3V0ZXI+IHMpIHsgZC5rICs9IHMuazsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzLi4uIEludGVyZmFjZXM+CmNsYXNzIEV4dGVuc2libGUgOiB2aXJ0dWFsIHB1YmxpYyBCYXNlLCB2aXJ0dWFsIHB1YmxpYyBJbnRlcmZhY2VzLi4uIHsKICAgIAogICAgY2xhc3MgVGhpbmcgOiB2aXJ0dWFsIHB1YmxpYyBCYXNlOjpUaGluZzxCYXNlPiwgdmlydHVhbCBwdWJsaWMgSW50ZXJmYWNlczo6dGVtcGxhdGUgVGhpbmc8QmFzZT4uLi4gewoKICAgIH07Cn07CgpjbGFzcyBTb21lSW50ZXJmYWNlIDogQmFzZSB7CiAgICB2b2lkIG11bHRpcGx5KFRoaW5nPFNvbWVJbnRlcmZhY2U+ICZkLCBjb25zdCBUaGluZzxTb21lSW50ZXJmYWNlPiBzKSB7IGQuayAqPSBzLms7IH0KICAgIAogICAgY2xhc3MgVGhpbmcgOiBwdWJsaWMgQmFzZTo6VGhpbmc8U29tZUludGVyZmFjZT4gewogICAgICAgIFRoaW5nJiBvcGVyYXRvcio9IChjb25zdCBUaGluZyBwKSB7CiAgICAgICAgICAgIF9iLm11bHRpcGx5KCp0aGlzLCBwKTsgcmV0dXJuICp0aGlzOyAvLyA8LS0gd29uJ3Qgd29yayBvZiBjb3Vyc2UKICAgICAgICB9OwoKICAgIH07Cgp9OwoKaW50IG1haW4oKSB7CiAgICBFeHRlbnNpYmxlPFNvbWVJbnRlcmZhY2U+IGE7CiAgICByZXR1cm4gMDsKfQo=