最終更新日時: 2026年03月12日 11時15分34秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<type_traits>

# std::apply_result(C++26)

    namespace std {
      template <class F, class Tuple>
      struct apply_result;

      template <class F, class Tuple>
      using apply_result_t = typename apply_result<F, Tuple>::type;
    }

## 概要

関数呼び出し可能な型`F`に対して、`tuple-like`な型`Tuple`の要素を展開して`apply`した場合の戻り値型を取得する。

`invoke_result`の`apply`版であり、タプルの要素を引数として関数を呼び出した結果の型を求める。

## 要件

型`F`および`Tuple`が、完全型であること。もしくは`const`/`volatile`修飾された(あるいはされていない)`void`か、要素数不明の配列型であること。

## 効果

`ELEMS-OF(T)`を、`make_index_sequence<tuple_size_v<remove_reference_t<T>>>`が示す`index_sequence`の特殊化のテンプレート引数である`size_t`のパラメータパック`N`に対する、パラメータパック`get<N>(declval<T>())`とする。

式INVOKE`(declval<F>(), ELEMS-OF(Tuple)...)`が未評価オペランドとして扱われたときに適格であるならば、メンバ型`type`は`decltype(`INVOKE`(declval<F>(), ELEMS-OF(Tuple)...))`を示す。そうでなければ、メンバ型`type`は定義されない。

アクセスチェックは`F`および`Tuple`と無関係なコンテキストで行われる。式の直接のコンテキストの妥当性のみが考慮される。

## 備考

このメタ関数はC++26で追加された。C++23まで`apply`の戻り値型は`decltype(auto)`による型推論が使われていたが、これはSFINAEフレンドリーではなかった。`apply_result`を使うことで、`apply`の呼び出し可能性をコンセプトやSFINAEで判定できるようになった。

## 例

    #include <tuple>
    #include <type_traits>
    #include <string>

    int add(int a, int b) { return a + b; }

    int main()
    {
      using args_t = std::tuple<int, int>;

      // apply(add, tuple<int, int>) の戻り値型は int
      static_assert(std::is_same_v<
        std::apply_result_t<decltype(&add), args_t>,
        int
      >);

      // 呼び出し不可能な場合、apply_result にはメンバ型 type がない
      // （SFINAEフレンドリー）
      static_assert(!requires {
        typename std::apply_result_t<decltype(&add), std::tuple<std::string>>;
      });
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: 22 ❌
- GCC: 15 ❌
- Visual C++: 2026 Update 2 ❌

## 関連項目

- `invoke_result`
- `is_applicable`
- `is_nothrow_applicable`
- `apply`

## 参照

- P1317R2 Remove return type deduction in `std::apply`