2013-06-04 13 views
13

Voglio fare un modello in cui posso inserire un indice e mi darà il tipo in quell'indice. So che posso farlo con decltype(std::get<N>(tup)) ma vorrei implementarlo da solo. Ad esempio, mi piacerebbe fare questo,Come ottenere l'N-esimo tipo da una tupla?

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

... e mi darà il tipo in posizione N - 1 (perché gli array indicizzati a partire da 0). Come posso fare questo? Grazie.

+0

Con il dovuto rispetto per la risposta sta bene 0x499602D2, penso che si dovrebbe accettare la risposta che suggerisce trait standard biblioteca. Per favore, considera di farlo. – einpoklum

risposta

12

È possibile utilizzare un modello di classe e specializzazioni parziali per fare ciò che si desidera. (Si noti che std::tuple_element fa quasi lo stesso come l'altra risposta dice):

#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 è proprio come ho deciso di farlo – 0x499602D2

10

Questo tratto esiste già e si chiama std::tuple_element.

Ecco un live example che dimostra il suo utilizzo.

+1

Ma ho detto che volevo implementarlo da solo. :) – user2030677

+0

Dato che * "So di poterlo fare ma vorrei implementarlo da solo." *, Questa non è una risposta ma un commento (anche se utile, dato che l'OP non sembra sapere di ' std :: tuple_element'). –

+0

@ user2030677: Mi dispiace, avrei dovuto leggere meglio il testo della domanda - In qualche modo ho saltato quella parte :) –