-   
- #include <iostream> 
-   
- struct Client 
- { 
-     template<class Request, class Response> 
-     void sendRequest(const Request& q , Response& a) 
-     { 
-         std::cout << q << " " << a << "\n"; 
-     } 
- }; 
-   
- template<class Q, class A, class ... Rest> 
- struct IClient : public virtual IClient<Rest ...> 
- { 
-     using IClient<Rest ...>::sendRequest; 
-     virtual void sendRequest(const Q& , A&) = 0; 
-   
-     ~IClient() = default; 
- }; 
-   
- template<class Q, class A> 
- struct IClient<Q, A> 
- { 
-     virtual void sendRequest(const Q& , A&) = 0; 
-     ~IClient() = default; 
- }; 
-   
- void foo(IClient<int, char, int, int, double, float>& client) 
- { 
-     int i = 10; 
-     char c = 'd'; 
-     double d = 3.14; 
-     float f = 100.5f; 
-     client.sendRequest(i, c); 
-     client.sendRequest(i, i); 
-     client.sendRequest(d, f); 
- } 
-   
- template<class Q, class A, class ... Rest> 
- struct ClientAdapter: public virtual IClient<Q, A, Rest ...>, public ClientAdapter<Rest ...> 
- { 
-     using ClientAdapter<Rest ...>::sendRequest; 
-   
-     Client& client; 
-     ClientAdapter(Client& c) : ClientAdapter<Rest...>(c), client(c) 
-     { 
-   
-     } 
-   
-     void sendRequest(const Q& q, A& a) override 
-     { 
-         client.sendRequest(q, a); 
-     } 
-   
-     ~ClientAdapter() = default; 
- }; 
-   
- template<class Q, class A> 
- struct ClientAdapter<Q, A> : public virtual IClient<Q, A> 
- { 
-     Client& client; 
-     ClientAdapter(Client& c) : client(c) { } 
-   
-     void sendRequest(const Q& q, A& a) override 
-     { 
-         client.sendRequest(q, a); 
-     } 
-   
-     ~ClientAdapter() = default; 
- }; 
-   
- int main() 
- { 
-     Client client; 
-     ClientAdapter<int, char, int, int, double, float> adapter(client); 
-     foo(adapter); 
- } 
-   
				CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBDbGllbnQKewogICAgdGVtcGxhdGU8Y2xhc3MgUmVxdWVzdCwgY2xhc3MgUmVzcG9uc2U+CiAgICB2b2lkIHNlbmRSZXF1ZXN0KGNvbnN0IFJlcXVlc3QmIHEgLCBSZXNwb25zZSYgYSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgcSA8PCAiICIgPDwgYSA8PCAiXG4iOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgUSwgY2xhc3MgQSwgY2xhc3MgLi4uIFJlc3Q+CnN0cnVjdCBJQ2xpZW50IDogcHVibGljIHZpcnR1YWwgSUNsaWVudDxSZXN0IC4uLj4KewogICAgdXNpbmcgSUNsaWVudDxSZXN0IC4uLj46OnNlbmRSZXF1ZXN0OwogICAgdmlydHVhbCB2b2lkIHNlbmRSZXF1ZXN0KGNvbnN0IFEmICwgQSYpID0gMDsKCiAgICB+SUNsaWVudCgpID0gZGVmYXVsdDsKfTsKCnRlbXBsYXRlPGNsYXNzIFEsIGNsYXNzIEE+CnN0cnVjdCBJQ2xpZW50PFEsIEE+CnsKICAgIHZpcnR1YWwgdm9pZCBzZW5kUmVxdWVzdChjb25zdCBRJiAsIEEmKSA9IDA7CiAgICB+SUNsaWVudCgpID0gZGVmYXVsdDsKfTsKCnZvaWQgZm9vKElDbGllbnQ8aW50LCBjaGFyLCBpbnQsIGludCwgZG91YmxlLCBmbG9hdD4mIGNsaWVudCkKewogICAgaW50IGkgPSAxMDsKICAgIGNoYXIgYyA9ICdkJzsKICAgIGRvdWJsZSBkID0gMy4xNDsKICAgIGZsb2F0IGYgPSAxMDAuNWY7CiAgICBjbGllbnQuc2VuZFJlcXVlc3QoaSwgYyk7CiAgICBjbGllbnQuc2VuZFJlcXVlc3QoaSwgaSk7CiAgICBjbGllbnQuc2VuZFJlcXVlc3QoZCwgZik7Cn0KCnRlbXBsYXRlPGNsYXNzIFEsIGNsYXNzIEEsIGNsYXNzIC4uLiBSZXN0PgpzdHJ1Y3QgQ2xpZW50QWRhcHRlcjogcHVibGljIHZpcnR1YWwgSUNsaWVudDxRLCBBLCBSZXN0IC4uLj4sIHB1YmxpYyBDbGllbnRBZGFwdGVyPFJlc3QgLi4uPgp7CiAgICB1c2luZyBDbGllbnRBZGFwdGVyPFJlc3QgLi4uPjo6c2VuZFJlcXVlc3Q7CgogICAgQ2xpZW50JiBjbGllbnQ7CiAgICBDbGllbnRBZGFwdGVyKENsaWVudCYgYykgOiBDbGllbnRBZGFwdGVyPFJlc3QuLi4+KGMpLCBjbGllbnQoYykKICAgIHsKCiAgICB9CgogICAgdm9pZCBzZW5kUmVxdWVzdChjb25zdCBRJiBxLCBBJiBhKSBvdmVycmlkZQogICAgewogICAgICAgIGNsaWVudC5zZW5kUmVxdWVzdChxLCBhKTsKICAgIH0KCiAgICB+Q2xpZW50QWRhcHRlcigpID0gZGVmYXVsdDsKfTsKCnRlbXBsYXRlPGNsYXNzIFEsIGNsYXNzIEE+CnN0cnVjdCBDbGllbnRBZGFwdGVyPFEsIEE+IDogcHVibGljIHZpcnR1YWwgSUNsaWVudDxRLCBBPgp7CiAgICBDbGllbnQmIGNsaWVudDsKICAgIENsaWVudEFkYXB0ZXIoQ2xpZW50JiBjKSA6IGNsaWVudChjKSB7IH0KCiAgICB2b2lkIHNlbmRSZXF1ZXN0KGNvbnN0IFEmIHEsIEEmIGEpIG92ZXJyaWRlCiAgICB7CiAgICAgICAgY2xpZW50LnNlbmRSZXF1ZXN0KHEsIGEpOwogICAgfQoKICAgIH5DbGllbnRBZGFwdGVyKCkgPSBkZWZhdWx0Owp9OwoKaW50IG1haW4oKQp7CiAgICBDbGllbnQgY2xpZW50OwogICAgQ2xpZW50QWRhcHRlcjxpbnQsIGNoYXIsIGludCwgaW50LCBkb3VibGUsIGZsb2F0PiBhZGFwdGVyKGNsaWVudCk7CiAgICBmb28oYWRhcHRlcik7Cn0K