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; 

online demo

hope helps.


Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -