最終更新日時(UTC):
が更新

履歴 編集

class template
<variant>

std::variant_alternative(C++17)

namespace std {
  template <std::size_t I, class T>
  struct variant_alternative;                       // (1) C++17 先行宣言

  template <std::size_t I, class T>
  struct variant_alternative<I, const T>;           // (2) C++17

  template <std::size_t I, class T>
  struct variant_alternative<I, volatile T>;        // (3) C++17
                                                    // C++20で非推奨

  template <std::size_t I, class T>
  struct variant_alternative<I, const volatile T>;  // (4) C++17
                                                    // C++20で非推奨

  template <std::size_t I, class T>
  using variant_alternative_t =
    typename variant_alternative<I, T>::type;       // (5) C++17

  template <std::size_t I, class... Types>
  struct variant_alternative<I, variant<Types...>>; // (6) C++17
}

概要

variant_alternativeは、std::variantクラスの候補型のうち、i番目の型を取得するためのクラスである。

  • (1) : 先行宣言
  • (2) : const修飾付きstd::variant型の候補型のうち、i番目の型を取得する
  • (3) : volatile修飾付きstd::variant型の候補型のうち、i番目の型を取得する
  • (4) : const volatile修飾付きstd::variant型の候補型のうち、i番目の型を取得する
  • (5) : typename::typeを省略するためのエイリアステンプレート版
  • (6) : 修飾なしstd::variant型の候補型のうち、i番目の型を取得する

要件

  • I < sizeof...(Types)であること。そうでない場合、プログラムは不適格となる

効果

  • (2) : std::variant<Types...>Types...のうち、I番目の型Tを取得し、std::add_const_t<T>をメンバ型typeとする
  • (3) : std::variant<Types...>Types...のうち、I番目の型Tを取得し、std::add_volatile_t<T>をメンバ型typeとする
  • (4) : std::variant<Types...>Types...のうち、I番目の型Tを取得し、std::add_cv_t<T>をメンバ型typeとする
  • (6) : std::variant<Types...>Types...のうち、I番目の型Tを取得し、その型をメンバ型typeとする

非推奨の詳細

  • (3), (4) : これらの部分特殊化は、型のvolatile修飾を部分的に非推奨にすることにともなって、非推奨化される

#include <variant>
#include <string>
#include <type_traits>

int main()
{
  // (6) CV修飾なしstd::variant型の、1番目の候補型を取得する
  static_assert(std::is_same_v<
    std::variant_alternative<
      1,
      std::variant<int, std::string, double>
    >::type,
    std::string
  >);

  // (2) const修飾付きstd::variant型の、2番目の候補型を取得する
  static_assert(std::is_same_v<
    std::variant_alternative<
      2,
      const std::variant<int, std::string, double>
    >::type,
    const double
  >);

  // (3) volatile修飾付きstd::variant型の、0番目の候補型を取得する
  static_assert(std::is_same_v<
    std::variant_alternative<
      0,
      volatile std::variant<int, std::string, double>
    >::type,
    volatile int
  >);

  // (4) const volatile修飾付きstd::variant型の、1番目の候補型を取得する
  static_assert(std::is_same_v<
    std::variant_alternative<
      1,
      const volatile std::variant<int, std::string, double>
    >::type,
    const volatile std::string
  >);

  // (5) エイリアステンプレート版
  static_assert(std::is_same_v<
    std::variant_alternative_t<
      2,
      std::variant<int, std::string, double>
    >,
    double
  >);
}

出力

バージョン

言語

  • C++17

処理系

関連項目

参照