fork(1) download
  1. #include <iostream>
  2. #include <initializer_list>
  3. #include <array>
  4. #include <tuple>
  5.  
  6. template<typename T, std::size_t N>
  7. struct ArrayInitializer {
  8. template<typename U> struct id { using type = U; };
  9. std::array<T, N> t;
  10.  
  11. template<typename U = std::initializer_list<T>>
  12. ArrayInitializer(typename id<U>::type z)
  13. :ArrayInitializer(z, std::make_index_sequence<N>())
  14. {
  15. if(N > z.size())
  16. throw std::out_of_range("that's crazy!");
  17. }
  18.  
  19. template<typename ...U>
  20. ArrayInitializer(U &&... u)
  21. :t{ std::forward<U>(u)... }
  22. { }
  23.  
  24. private:
  25. template<std::size_t ...Ns>
  26. ArrayInitializer(std::initializer_list<T>& t,
  27. std::index_sequence<Ns...>)
  28. :t{ *(t.begin() + Ns) ... }
  29. { }
  30. };
  31.  
  32. template<typename T, std::size_t N>
  33. std::array<T, N> f(ArrayInitializer<T, N> ai) {
  34. return std::move(ai.t);
  35. }
  36.  
  37. int main() {
  38. f<int, 5>({1, 2, 3, 4, 5}); // OK
  39. //f<int, 5>({1, 2, 3, 4, 5, 6}); // error - "too many initializers for array<int, 5>"
  40.  
  41. std::initializer_list<int> il{1, 2, 3, 4, 5};
  42. f<int, 5>(il); // ok
  43. }
Success #stdin #stdout 0s 3452KB
stdin
Standard input is empty
stdout
Standard output is empty