fork(2) download
  1. #include <iostream>
  2. #include <list>
  3. #include <utility>
  4.  
  5. using namespace std;
  6.  
  7. typedef list<pair<string, string> > KeyVal;
  8. struct Header { string name; string value; Header(string name, string value) : name(name), value(value) {}; };
  9. struct Param { string name; string value; Param(string name, string value) : name(name), value(value) {}; };
  10.  
  11. /* Something that contains headers */
  12. template<typename T> class WithHeaders {
  13. KeyVal headers;
  14. public:
  15. virtual T &operator <<(const Header &h) {
  16. headers.push_back(pair<string, string>(h.name, h.value));
  17. return static_cast<T&> (*this);
  18. }
  19. };
  20.  
  21. /* Something that contains query params */
  22. template<class T> class WithQuery {
  23. KeyVal query_params;
  24.  
  25. public:
  26. virtual T &operator <<(const Param &q) {
  27. query_params.push_back(pair<string, string>(q.name, q.value));
  28. return static_cast<T&> (*this);
  29. }
  30.  
  31. const KeyVal &get_query() const {return query_params;}
  32. };
  33.  
  34. /* Http Request has both headers and query parameters */
  35. class Request: public WithQuery<Request>, public WithHeaders<Request> {
  36. public:
  37. using WithHeaders<Request>::operator<<;
  38. using WithQuery<Request>::operator<<;
  39. };
  40.  
  41. int main() {
  42. Request rq;
  43. rq << Header("a", "b");
  44. return 0;
  45. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Standard output is empty