ventana tiempo programacion porque personalizar muestra mostrar los herramientas hacer errores error dev compilacion como barra aparecer c++ templates c++11 compile-time typetraits

c++ - programacion - tiempo de compilacion



¿Cómo cambio/selecciono tipos durante el tiempo de compilación? (4)

¿Existe una forma estándar para que seleccione un tipo en tiempo de compilación en un índice sin firmar 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 una versión de plantilla variadic, sería muy útil.


Con C ++ 17 también puede hacerlo de otra manera. En lugar de calcular explícitamente el tipo, puede usar constexpr if y hacer cosas diferentes (incluyendo devolver diferentes tipos) directamente:

template<size_t N> decltype(auto) foo(){ if constexpr(N%2==0){ return std::string("Hello I''m even"); }else{ return std::pair( std::vector<char>{''O'',''d'',''d'','' '',''v'',''a'',''l'',''u'',''e''}, [](){ return N; }); } } foo<0>() // "Hello I''m even" foo<21>().second() // 21

También puede usar esto para obtener solo el tipo:

using type_0 = decltype(foo<0>()); using type_1 = decltype(foo<1>());


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; };


Probablemente pueda usar un boost::mpl::vector para almacenar sus tipos y use boost::mpl::at<v,n>::type para obtener un tipo con del índice.

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


Qué tal si

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;};

Lo usarías de la siguiente manera:

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 se implementa más o menos para usted en std::conditional .