我是否有一种标准方法可以在c ++ 11中的无符号索引上选择编译时类型?
例如:
using type_0 = static_switch<0,T,U>; // yields type T
using type_1 = static_switch<1,T,U>; // yields type U
如果存在variadic-template版本,那将非常有用。
答案 0 :(得分:46)
这应该有效:
template<std::size_t N, typename... T>
using static_switch = typename std::tuple_element<N, std::tuple<T...> >::type;
另一种方法:
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;
};
答案 1 :(得分:10)
您可以使用boost::mpl::vector
来存储您的类型,并使用boost::mpl::at<v,n>::type
从索引中获取类型。
template<std::size_t N, typename... T>
using static_switch = typename boost::mpl::at<boost::mpl::vector<T...>, N>::type;
答案 2 :(得分:8)
怎么样
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;};
您可以按如下方式使用它:
using type_0 = static_switch<0,T,U>::type; // yields type T
using type_1 = static_switch<1,T,U>::type; // yields type U
在std::conditional中或多或少地为您实现了这一点。
答案 3 :(得分:2)
使用C ++ 17,您也可以采用另一种方式。您可以使用constexpr if
而不是直接计算类型,而是直接执行不同的操作(包括返回不同的类型):
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
您也可以使用它来获取类型:
using type_0 = decltype(foo<0>());
using type_1 = decltype(foo<1>());