2013-06-04 9 views
13

Chcę utworzyć szablon, w którym mogę wprowadzić indeks, a otrzymam typ tego indeksu. Wiem, że mogę to zrobić z decltype(std::get<N>(tup)), ale sam chciałbym to zaimplementować. Na przykład, chciałbym to zrobić,Jak uzyskać N-ty typ z krotki?

typename get<N, std::tuple<int, bool, std::string>>::type; 

... i to daje mi typ w pozycji N - 1 (bo tablice indeksowanych zaczynając od 0). Jak mogę to zrobić? Dzięki.

+0

Z szacunkiem dla drobnego odpowiedź 0x499602D2 jest, myślę, że należy przyjąć odpowiedzi sugerujące standardową Biblioteka cechę. Proszę, rozważ to. – einpoklum

Odpowiedz

12

Możesz użyć szablonu klasy i częściowych specjalizacji, aby zrobić to, co chcesz. (Zauważ, że std::tuple_element robi prawie taka sama jak druga odpowiedź mówi):

#include <tuple> 
#include <type_traits> 

template <int N, typename... Ts> 
struct get; 

template <int N, typename T, typename... Ts> 
struct get<N, std::tuple<T, Ts...>> 
{ 
    using type = typename get<N - 1, std::tuple<Ts...>>::type; 
}; 

template <typename T, typename... Ts> 
struct get<0, std::tuple<T, Ts...>> 
{ 
    using type = T; 
}; 

int main() 
{ 
    using var = std::tuple<int, bool, std::string>; 
    using type = get<2, var>::type; 

    static_assert(std::is_same<type, std::string>::value, ""); // works 
} 
+0

@ user1131467 to po prostu jak zdecydowałem to zrobić – 0x499602D2

10

Ta cecha już istnieje i nazywa się std::tuple_element.

Oto live example, który demonstruje jego użycie.

+1

Ale powiedziałem, że chciałem to sam wdrożyć. :) – user2030677

+0

Biorąc pod uwagę, że * "Wiem, że mogę to zrobić, ale sam chciałbym to wdrożyć." *, To nie jest odpowiedź, ale komentarz (choć przydatny, ponieważ OP nie wydaje się wiedzieć o ... std :: tuple_element'). –

+0

@ user2030677: Przykro mi, powinienem był przeczytać tekst pytania lepiej - jakoś pominąłem tę część :) –