2016-12-30 14 views
9

私はそのような関数を見つけられなかったので(間違っていますか?)、std::array<T,n> arrT tをとり、コンパイル時に新しい関数を返す関数をコンパイルしようとしています(constexpr)。 std::array<T,n+1>arrの末尾に追加されています。私はこのようなものから始めました:std :: arrayに追加

template <typename T, int n> 
constexpr std::array<T,n+1> append(std::array<T,n> a, T t); 

template <typename T> 
constexpr std::array<T,1> append(std::array<T,0> a, T t) 
{ 
    return std::array<T,1>{t}; 
} 

template <typename T> 
constexpr std::array<T,2> append(std::array<T,1> a, T t) 
{ 
    return std::array<T,2>{a[0], t}; 
} 

ここで私は立ち往生します。私が必要とするものは、を最初のnのイニシャライザリストに展開し、最後にtを追加する方法です。それは可能ですか?または、これを行う別の方法がありますか?

答えて

13

もちろん、可能です:std::index_sequence<I...>はあなたの友人です!適切なstd::index_sequence<I...>を引数とする関数に単純にディスパッチし、すべての値でパックを展開します。たとえば:

template <typename T, std::size_t N, std::size_t... I> 
constexpr std::array<T, N + 1> 
append_aux(std::array<T, N> a, T t, std::index_sequence<I...>) { 
    return std::array<T, N + 1>{ a[I]..., t }; 
} 
template <typename T, std::size_t N> 
constexpr std::array<T, N + 1> append(std::array<T, N> a, T t) { 
    return append_aux(a, t, std::make_index_sequence<N + 1>()); 
} 
+1

ここ数秒で私を叩いてください:) upvote – StoryTeller

+0

うわー、私には純粋な魔法! C++は、近年、長い道のりを歩んできました。ありがとう! – kalj

+0

C++ 11には、 'integer_sequence'の効率的な実装が利用可能であるということを追加する価値があります。 [これは](https://gitlab.com/redistd/integer_seq/blob/master/integer_seq.h)残念ながらボックスから出てこないので。 –

関連する問題