fork download
  1. #include <iostream>
  2. #include <initializer_list>
  3. #include <vector>
  4.  
  5. // aggregate type
  6. struct Foo
  7. {
  8. int i;
  9. char c;
  10. };
  11.  
  12. // disaggregate type
  13. struct Bar
  14. {
  15. private:
  16. size_t d;
  17.  
  18. public:
  19. // initializer-list constructor
  20. Bar(std::initializer_list<int> initr)
  21. : d{ initr.size() }
  22. {}
  23.  
  24. int getD() const { return d; }
  25. };
  26.  
  27. // display argument
  28. template<typename Range>
  29. void disp(Range const& rng)
  30. {
  31. std::cout << "{ ";
  32. char const* sep = "";
  33. for( auto const& x: rng)
  34. {
  35. std::cout << sep << x;
  36. sep = ", ";
  37. }
  38. std::cout << " }" << std::endl;
  39. }
  40. template<>
  41. void disp<Foo>( Foo const& foo )
  42. {
  43. std::cout << "{ " << foo.i << ", '" << foo.c << "' }" << std::endl;
  44. }
  45. template<>
  46. void disp<Bar>( Bar const& bar )
  47. {
  48. std::cout << "{ " << bar.getD() << " }" << std::endl;
  49. }
  50.  
  51.  
  52. int main(int, char*[])
  53. {
  54. std::cout << "aggregate type" << std::endl;
  55. int arr[3] = { 0, 1, 2 };
  56. Foo foo = { 0, 'a' };
  57.  
  58. disp(arr);
  59. disp(foo);
  60.  
  61. std::cout << "vector" << std::endl;
  62. std::vector<int> v(0);
  63. v.reserve(3);
  64. v.push_back(0);
  65. v.push_back(1);
  66. v.push_back(2);
  67.  
  68. disp(v);
  69.  
  70. std::cout << "initializer-list" << std::endl;
  71. Bar bar = { 1, 2, 3 };
  72. disp(bar);
  73.  
  74. // possible to make a vector const
  75. std::vector<int> const u = { 1, 2, 3 };
  76. disp(u);
  77.  
  78. return 0;
  79. }
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
aggregate type
{ 0, 1, 2 }
{ 0, 'a' }
vector
{ 0, 1, 2 }
initializer-list
{ 3 }
{ 1, 2, 3 }