c++ 如何在编译时切换/选择类型?

qlfbtfca  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(136)

在c++11中,有没有一种标准的方法可以让我在编译时在无符号索引上选择类型?
例如,类似于:

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

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

5n0oy7gb

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

qvsjd97n2#

您可能会使用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;
gz5pxeao

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中或多或少已经实现了。

zwghvu4y

zwghvu4y4#

在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>());

相关问题