c++ - How to initialize std::array<T, n> elegantly if T is not default constructible? -
how initialize std::array<t, n> if t not default constructible?
i know it's possible initialize that:
t t{args}; std::array<t, 5> a{t, t, t, t, t};   but n me template parameter:
template<typename t, int n> void f(t value) {     std::array<t, n> items = ???  }   and if wasn't template, it's quite ugly repeat value hand if n large.
given n, generate sequence-type calledseq<0,1,2,3,...n-1> using generator called genseq_t<>, this:
template<typename t, int n> void f(t value) {      //genseq_t<n> seq<0,1,...n-1>      std::array<t, n> items = repeat(value, genseq_t<n>{}); }   where repeat defined as:
template<typename t, int...n> auto repeat(t value, seq<n...>) -> std::array<t, sizeof...(n)>  {    //unpack n, repeating `value` sizeof...(n) times    //note (x, value) evaluates value    return {(n, value)...};  }   and rest defined as:
template<int ... n> struct seq {    using type = seq<n...>;     static const std::size_t size = sizeof ... (n);     template<int i>    struct push_back : seq<n..., i> {}; };  template<int n> struct genseq : genseq<n-1>::type::template push_back<n-1> {};  template<> struct genseq<0> : seq<> {};  template<int n> using genseq_t = typename genseq<n>::type;     hope helps.
Comments
Post a Comment