fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. template <typename M, typename T> void process(M&, T&);
  6.  
  7. template <typename M, typename T> void process_impl(M& m, const T& t) { m.write(t); }
  8. template <typename M, typename T> void process_impl(M& m, const std::vector<T>& v)
  9. {
  10. for(const auto& t : v) {
  11. process(m, t);
  12. }
  13. }
  14.  
  15. template <typename M, typename T> void process(M& m, const T& t) { process_impl(m, t); }
  16.  
  17. struct media
  18. {
  19. template <typename T> void write(const T& t) { std::cout << t << std::endl; }
  20. };
  21. void process(media& m, const std::string& s) { process(m, s.size()); }
  22.  
  23. template <typename M> struct debug_media
  24. {
  25. template <typename T> void write(const T& t) { m.write(t); }
  26.  
  27. media m;
  28. };
  29. template <typename M, typename T> void process(debug_media<M>& d, const T& t)
  30. {
  31. std::cout << "debug: ";
  32. process(d.m, t);
  33. }
  34.  
  35. template <typename M, typename T> void process(debug_media<M>& d, const std::vector<T>& v)
  36. {
  37. for(const auto& t : v) {
  38. process(d, t);
  39. }
  40. }
  41.  
  42. int main()
  43. {
  44. {
  45. media m;
  46. process(m, std::vector<std::string>{ "1", "22" });
  47. }
  48. {
  49. debug_media<media> m;
  50. process(m, std::vector<std::string>{ "1", "22" });
  51. }
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
1
2
debug: 1
debug: 2