#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