38 votos

¿Cómo puedo cambiar/seleccione los tipos durante el tiempo de compilación?

Hay una manera estándar para que me seleccione un tipo en tiempo de compilación en un unsigned índice en c++11?

Por ejemplo, algo como:

using type_0 = static_switch<0,T,U>;  // yields type T
using type_1 = static_switch<1,T,U>;  // yields type U

Si hay un variadic-versión de la plantilla, sería muy útil.

47voto

Pubby Puntos 29386

Esto debería funcionar:

template<std::size_t N, typename... T>
using static_switch = typename std::tuple_element<N, std::tuple<T...> >::type;

Otro método:

template<std::size_t N, typename T, typename... Ts>
struct static_switch {
  using type = typename static_switch<N - 1, Ts...>::type;
};
template<typename T, typename... Ts>
struct static_switch<0, T, Ts...> {
  using type = T;
};

10voto

Morwenn Puntos 4071

Usted probablemente podría utilizar un boost::mpl::vector a la tienda de su tipo y uso boost::mpl::at<v,n>::type para obtener un tipo de índice.

template<std::size_t N, typename... T>
using static_switch = typename boost::mpl::at<boost::mpl::vector<T...>, N>::type;

8voto

Alex Chamberlain Puntos 2851

¿

 template<size_t N, typename T, typename U>
 struct static_switch {};

 template<typename T, typename U>
 struct static_switch<0, T, U>{typedef T type;};

 template<typename T, typename U>
 struct static_switch<1, T, U>{typedef U type;};

Usted podría utilizarlo como sigue:

using type_0 = static_switch<0,T,U>::type;  // yields type T
using type_1 = static_switch<1,T,U>::type;  // yields type U

Esto es más o menos implementado en std::condicional.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X