2013-08-05 3 views
8

Se ho una tupla con diversi tipi di elementi comeOttieni l'indice del tipo di elemento di una tupla?

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

e come ottenere l'indice di un tipo di elemento?

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

Grazie.

+0

Cosa succede se si ha 'std :: tuple ' e si chiede 'int'? Anche perché ne hai bisogno? – Borgleader

+0

Suppongo che la tupla abbia diversi tipi di elementi. In assenza di tale ipotesi, ottenere una corrispondenza va bene. Lo uso per implementare una efficiente fabbrica astratta con una tupla di classi derivate da una classe base. – user1899020

+0

Stai cercando un ambiente specifico o solo un C++ generale? – css

risposta

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.

Questa implementazione restituisce l'indice della prima occorrenza di un determinato tipo. Chiedendo l'indice di un tipo che non è nella tupla, si ottiene un errore di compilazione (e abbastanza brutto).

+0

Se un tipo non è tra i tipi di elemento, qual è il comportamento? – user1899020

+0

@ user1899020 [Errore in fase di compilazione.] (Http://coliru.stacked-crooked.com/view?id=00d44c11b2bfb4ce09cd43c8bfe57739-c944ac6b0eed3bfc48b1f78a894f6965) – Casey

+0

I test 'std :: cout <<" Indice = " << Indice :: value << std :: endl; ' in Coliru, ma fornisce 1. – user1899020