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 .