2016-12-30 13 views
9

Ponieważ nie mogłem znaleźć takiej funkcji (niepoprawnie?), Próbuję wykonać funkcję kompilacji (constexpr), która pobiera std::array<T,n> arr i T t i zwraca nową std::array<T,n+1> z t dodanym na końcu arr. Zacząłem od czegoś takiego:Dołącz do 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}; 
} 

Tutaj utknęłam. Potrzebuję sposobu na rozwinięcie a w pierwszych miejscach n na liście inicjalizacyjnej, a następnie dodanie końcówki t. Czy to jest możliwe? Czy jest inny sposób na zrobienie tego?

Odpowiedz

13

Oczywiście, jest to możliwe: std::index_sequence<I...> jest twoim przyjacielem! Po prostu wyślesz funkcję, która przyjmie odpowiedni argument std::index_sequence<I...> i rozszerzy pakiet o wszystkie wartości. Na przykład:

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

Pokonaj mnie kilka sekund :) Oto awans – StoryTeller

+0

Wow, czysta magia dla mnie! C++ w ubiegłym roku znacznie się rozwinęło. Dzięki! – kalj

+0

Warto dodać, że dla C++ 11 dostępne są wydajne implementacje 'integer_sequence' np. [ten] (https://gitlab.com/redistd/integer_seq/blob/master/integer_seq.h), ponieważ niestety nie wychodzi z pudełka. –