38

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 バージョンがあれば、非常に便利です。

4

4 に答える 4

48

これはうまくいくはずです:

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;
};
于 2013-03-14T08:14:28.760 に答える
10

おそらく aboost::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;
于 2013-03-14T08:16:12.360 に答える
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に実装されています。

于 2013-03-14T08:18:49.820 に答える
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>());
于 2016-07-22T18:04:43.397 に答える