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