fork download
  1. #include <iostream>
  2. #include <utility>
  3. #include <initializer_list>
  4.  
  5. template < typename T, std::size_t N > struct c_array
  6. {
  7. static_assert( std::is_pod<T>::value, "must be a pod!" ) ;
  8. static_assert( N, "size must be a non-zero!" ) ;
  9.  
  10. c_array() : a { T() } {}
  11. template < typename... U > c_array( U&&... args ) : a { args... } {} // ??
  12.  
  13. c_array( std::initializer_list< std::pair<std::size_t,T> > il ) : c_array<T,N>()
  14. { for( const auto& p : il ) if(p.first<N) a[p.first] = p.second ; }
  15.  
  16. T& operator[] ( std::size_t p ) { return a[p] ; }
  17. const T& operator[] ( std::size_t p ) const { return a[p] ; }
  18.  
  19. T* begin() { return std::begin(a) ; }
  20. T* end() { return std::end(a) ; }
  21. const T* begin() const { return std::begin(a) ; }
  22. const T* end() const { return std::end(a) ; }
  23.  
  24. T a[N] ;
  25. };
  26.  
  27. int main()
  28. {
  29. c_array<int,5> a ; // value initialized
  30. for( auto i : a ) std::cout << i << ' ' ; std::cout << '\n' ;
  31.  
  32. c_array<long,6> b { 1, 2, 3, 4 };
  33. for( auto i : b ) std::cout << i << ' ' ; std::cout << '\n' ;
  34.  
  35. // initialize by position, and value initialize unspecified positions
  36. c_array<short,8> c { { 1, 8 }, { 3, 9 }, { 5, 2 }, { 6, -1 } };
  37. for( auto s : c ) std::cout << s << ' ' ; std::cout << '\n' ;
  38. }
  39.  
Success #stdin #stdout 0s 2896KB
stdin
Standard input is empty
stdout
0 0 0 0 0 
1 2 3 4 0 0 
0 8 0 9 0 2 -1 0