2013-08-05 18 views
8

Jeśli mam krotki z różnych typów elementów jakUzyskaj indeks typu elementu krotki?

std::tuple<T0, T1, T2, ...> 

i jak uzyskać indeks typu elementu?

template<class T, class Tuple> 
struct Index 
{ 
    enum {value = ?;} 
}; 

Dzięki.

+0

Co się dzieje, jeśli masz 'std :: tuple ' i pytasz o 'int'? Dlaczego tego potrzebujesz? – Borgleader

+0

Zakładam, że krotka ma różne typy elementów. Jeśli nie ma takiego założenia, każdy mecz jest w porządku. Używam go do implementowania wydajnej fabryki abstrakcyjnej przez daną krotkę klas pochodnych klasy podstawowej. – user1899020

+0

Czy szukasz go do określonego środowiska, lub po prostu ogólne C++? – css

Odpowiedz

12
template <class T, class Tuple> 
struct Index; 

template <class T, class... Types> 
struct Index<T, std::tuple<T, Types...>> { 
    static const std::size_t value = 0; 
}; 

template <class T, class U, class... Types> 
struct Index<T, std::tuple<U, Types...>> { 
    static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value; 
}; 

See it live at Coliru.

Implementacja ta zwraca indeks pierwszego wystąpienia danego typu. Pytanie o indeks typu, który nie znajduje się w krotce, powoduje błąd kompilacji (a przy tym dość brzydki).

+0

Jeśli typ nie należy do typów elementów, jakie jest zachowanie? – user1899020

+0

@ user1899020 [Błąd kompilacji.] (Http://coliru.stacked-crooked.com/view?id=00d44c11b2bfb4ce09cd43c8bfe57739-c944ac6b0eed3bfc48b1f78a894f6965) – Casey

+0

Testuję 'std :: cout <<" Indeks = " << Indeks :: value << std :: endl; ' w Coliru, ale daje 1. – user1899020

Powiązane problemy