2013-03-14 2 views
9

Existe-t-il un moyen de remplacer un élément de ligne à l'heure de compilation?Comment remplacer un élément tuple au moment de la compilation?

Par exemple,

using a_t = std::tuple<std::string,unsigned>; // start with some n-tuple 
using b_t = element_replace<a_t,1,double>;  // std::tuple<std::string,double> 
using c_t = element_replace<b_t,0,char>;  // std::tuple<char,double> 

Répondre

17

Vous pouvez utiliser ceci:

// the usual helpers (BTW: I wish these would be standardized!!) 
template< std::size_t... Ns > 
struct indices 
{ 
    typedef indices< Ns..., sizeof...(Ns) > next; 
}; 

template< std::size_t N > 
struct make_indices 
{ 
    typedef typename make_indices< N - 1 >::type::next type; 
}; 

template<> 
struct make_indices<0> 
{ 
    typedef indices<> type; 
}; 

// and now we use them 
template< typename Tuple, std::size_t N, typename T, 
      typename Indices = typename make_indices< std::tuple_size<Tuple>::value >::type > 
struct element_replace; 

template< typename... Ts, std::size_t N, typename T, std::size_t... Ns > 
struct element_replace< std::tuple<Ts...>, N, T, indices<Ns...> > 
{ 
    typedef std::tuple< typename std::conditional< Ns == N, T, Ts >::type... > type; 
}; 

puis l'utiliser comme ceci:

using a_t = std::tuple<std::string,unsigned>;  // start with some n-tuple 
using b_t = element_replace<a_t,1,double>::type; // std::tuple<std::string,double> 
using c_t = element_replace<b_t,0,char>::type; // std::tuple<char,double> 
+3

Indices. ♥♥♥♥♥♥ – Xeo

+0

J'ai besoin d'apprendre ce tour. +1 – jrok

+0

+1: compact et élégant –

0

Vous pouvez accéder aux types des éléments d'un type de tuple utilisant std::tuple_element. Cela ne vous permet pas réellement de remplacer les types d'éléments de tuple, mais vous permet de définir des types de tuple en termes de types utilisés comme types d'éléments dans d'autres types de tuple.

Questions connexes