2013-06-04 5 views
13

Ich möchte eine Vorlage erstellen, wo ich einen Index eingeben kann und es gibt mir den Typ an diesem Index. Ich weiß, dass ich das mit decltype(std::get<N>(tup)) tun kann, aber ich möchte das selbst implementieren. Zum Beispiel würde Ich mag, dies zu tun,Wie bekomme ich N-ten Typ von einem Tupel?

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

... und es gibt mir die Art an Position N - 1 (weil Arrays ausgehend von 0 indexierten). Wie kann ich das machen? Vielen Dank.

+0

Unter gebührender Berücksichtigung der 0x499602D2 ist in Ordnung Antwort, ich glaube, Sie sollten die Antwort darauf hindeutet, Standard-Bibliothek Eigenschaft akzeptieren. Bitte überlegen Sie, dies zu tun. – einpoklum

Antwort

12

Sie können eine Klassenvorlage und teilweise Spezialisierungen verwenden, um das zu tun, was Sie wollen. (Beachten Sie, dass std::tuple_element macht fast die gleiche wie die andere Antwort sagt):

#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 es ist nur, wie ich mich entschied, es zu tun – 0x499602D2

10

Dieses Merkmal existiert bereits und es heißt std::tuple_element.

Hier ist eine live example, die ihre Verwendung demonstriert.

+1

Aber ich sagte, ich wollte das selbst implementieren. :) – user2030677

+0

Vorausgesetzt, dass * "Ich weiß, dass ich das tun kann, aber ich möchte das selbst implementieren." *, Das ist keine Antwort, aber ein Kommentar (obwohl ein nützlicher, da das OP nicht über 'scheint std :: tuple_element'). –

+0

@ user2030677: Tut mir leid, ich hätte den Text der Frage besser lesen sollen - ich habe diesen Teil irgendwie übersprungen :) –

Verwandte Themen