在c++11中,有没有一种标准的方法可以让我在编译时在无符号索引上选择类型?例如,类似于:
using type_0 = static_switch<0, T, U>; // yields type T using type_1 = static_switch<1, T, U>; // yields type U
如果有一个可变模板版本,它将非常有用。
5n0oy7gb1#
这应该行得通:
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; };
qvsjd97n2#
您可能会使用boost::mpl::vector来存储类型,并使用boost::mpl::at<v, n>::type从索引中获取类型。
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;
gz5pxeao3#
不如
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中或多或少已经实现了。
zwghvu4y4#
在C++17中,你也可以用另一种方式来处理这个问题,不用显式计算类型,你可以直接使用constexpr if来做不同的事情(包括返回不同的类型):
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>());
4条答案
按热度按时间5n0oy7gb1#
这应该行得通:
另一种方法:
qvsjd97n2#
您可能会使用
boost::mpl::vector
来存储类型,并使用boost::mpl::at<v, n>::type
从索引中获取类型。gz5pxeao3#
不如
您可以按如下方式使用它:
这在std::conditional中或多或少已经实现了。
zwghvu4y4#
在C++17中,你也可以用另一种方式来处理这个问题,不用显式计算类型,你可以直接使用
constexpr if
来做不同的事情(包括返回不同的类型):您也可以使用此函数来获取类型: