fork download
  1.  
  2. #include <iostream>
  3.  
  4. struct Client
  5. {
  6. template<class Request, class Response>
  7. void sendRequest(const Request& q , Response& a)
  8. {
  9. std::cout << q << " " << a << "\n";
  10. }
  11. };
  12.  
  13. template<class Q, class A, class ... Rest>
  14. struct IClient : public virtual IClient<Rest ...>
  15. {
  16. using IClient<Rest ...>::sendRequest;
  17. virtual void sendRequest(const Q& , A&) = 0;
  18.  
  19. ~IClient() = default;
  20. };
  21.  
  22. template<class Q, class A>
  23. struct IClient<Q, A>
  24. {
  25. virtual void sendRequest(const Q& , A&) = 0;
  26. ~IClient() = default;
  27. };
  28.  
  29. void foo(IClient<int, char, int, int, double, float>& client)
  30. {
  31. int i = 10;
  32. char c = 'd';
  33. double d = 3.14;
  34. float f = 100.5f;
  35. client.sendRequest(i, c);
  36. client.sendRequest(i, i);
  37. client.sendRequest(d, f);
  38. }
  39.  
  40. template<class Q, class A, class ... Rest>
  41. struct ClientAdapter: public virtual IClient<Q, A, Rest ...>, public ClientAdapter<Rest ...>
  42. {
  43. using ClientAdapter<Rest ...>::sendRequest;
  44.  
  45. Client& client;
  46. ClientAdapter(Client& c) : ClientAdapter<Rest...>(c), client(c)
  47. {
  48.  
  49. }
  50.  
  51. void sendRequest(const Q& q, A& a) override
  52. {
  53. client.sendRequest(q, a);
  54. }
  55.  
  56. ~ClientAdapter() = default;
  57. };
  58.  
  59. template<class Q, class A>
  60. struct ClientAdapter<Q, A> : public virtual IClient<Q, A>
  61. {
  62. Client& client;
  63. ClientAdapter(Client& c) : client(c) { }
  64.  
  65. void sendRequest(const Q& q, A& a) override
  66. {
  67. client.sendRequest(q, a);
  68. }
  69.  
  70. ~ClientAdapter() = default;
  71. };
  72.  
  73. int main()
  74. {
  75. Client client;
  76. ClientAdapter<int, char, int, int, double, float> adapter(client);
  77. foo(adapter);
  78. }
  79.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
10 d
10 10
3.14 100.5