fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <utility>
  5. #include <vector>
  6. #include <set>
  7. using namespace std;
  8.  
  9.  
  10. template <class Ostream>
  11. class Writer
  12. {
  13. Ostream &os;
  14. template <class... Any>
  15. void print(Any&&... any)
  16. {
  17. // это "трюк", дающий небольшое удобство:
  18. // возможность писать в print подряд набор значений;
  19. int _[] = { ((*this)(forward<Any>(any)), 0)... };
  20. // ну и маленькая демонстрация variadic templates :)
  21. }
  22.  
  23. template <class Name, class Lit, class Cont>
  24. void prints
  25. (
  26. const Name &name,
  27. const Cont &cont,
  28. Lit open,
  29. Lit delim,
  30. Lit close
  31. )
  32. {
  33. print(name, open);
  34. auto p = begin(cont), e = end(cont);
  35. if (p != e)
  36. {
  37. print(*p);
  38. while (++p != e)
  39. print(delim, *p);
  40. }
  41. print(close);
  42. }
  43.  
  44. public:
  45. explicit Writer(Ostream &os)
  46. : os(os) {}
  47.  
  48. // общий вариант, полагается на оператор <<
  49. template <class Any>
  50. void operator()(const Any &x)
  51. {
  52. os << x;
  53. }
  54.  
  55. // вариант для строк, берёт содержимое в кавычки
  56. template <class Char, class Traits, class Alloc>
  57. void operator()(const basic_string<Char, Traits, Alloc> &s)
  58. {
  59. os << quoted(s);
  60. }
  61.  
  62. template <class Name, class Item, class Alloc>
  63. void operator()(const Name &name, const vector<Item, Alloc> &v)
  64. {
  65. prints(name, v, ": [", ", ", "]");
  66. }
  67.  
  68. template <class Name, class Item, class Comp, class Alloc>
  69. void operator()(const Name &name, const set<Item, Comp, Alloc> &s)
  70. {
  71. prints(name, s, ": {", ", ", "}");
  72. }
  73.  
  74. // можно продолжить для других контейнеров
  75. };
  76.  
  77.  
  78. template <class Ostream>
  79. inline auto make_writer(Ostream &os)
  80. {
  81. return Writer<Ostream>(os);
  82. }
  83.  
  84.  
  85. int main()
  86. {
  87. auto writer = make_writer(cout);
  88. vector<int> a { 1, 2, 3, 42 };
  89. set<string> b { "aleph"s, "beth"s, "daleth"s };
  90.  
  91. writer("vector"s, a);
  92. cout << endl;
  93. writer("set"s, b);
  94. return 0;
  95. }
  96.  
Success #stdin #stdout 0s 3280KB
stdin
Standard input is empty
stdout
"vector": [1, 2, 3, 42]
"set": {"aleph", "beth", "daleth"}