如何在编译期间切换/selecttypes?

有没有一种标准的方式,我可以在编译时在c + + 11中的无符号索引select一个types?

例如,像这样的东西:

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

如果有一个可变模板版本,这将是非常有用的。

这应该工作:

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

你可能可以使用boost::mpl::vector来存储你的types,并使用boost::mpl::at<v,n>::type从index中获得一个types。

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

怎么样

  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中或多或less的被你实现了。

用C ++ 17,你也可以用另一种方式去做。 而不是明确地计算types,你可以使用constexpr if和做不同的事情(包括返回不同的types)直接:

 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 

你也可以使用它来获得types:

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