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