• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <variant>

    std::variant_alternative

    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

    処理系

    関連項目

    参照