如何在编译期间切换/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>());