How to initialize std::array elegantly if T is not default constructible?

后端 未结 3 709
名媛妹妹
名媛妹妹 2020-11-27 05:59

How do I initialize std::array if T is not default constructible?

I know it\'s possible to initialize it like that:

3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-27 06:37

    Given N, you could generate a sequence-type calledseq<0,1,2,3,...N-1> using a generator called genseq_t<>, then do this:

    template
    void f(T value)
    {
         //genseq_t is seq<0,1,...N-1>
         std::array items = repeat(value, genseq_t{});
    }
    

    where repeat is defined as:

    template
    auto repeat(T value, seq) -> std::array 
    {
       //unpack N, repeating `value` sizeof...(N) times
       //note that (X, value) evaluates to value
       return {(N, value)...}; 
    }
    

    And the rest is defined as:

    template
    struct seq
    {
       using type = seq;
    
       static const std::size_t size = sizeof ... (N);
    
       template
       struct push_back : seq {};
    };
    
    template
    struct genseq : genseq::type::template push_back {};
    
    template<>
    struct genseq<0> : seq<> {};
    
    template
    using genseq_t = typename genseq::type;
    

    Online demo

    Hope that helps.

提交回复
热议问题