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

履歴 編集

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_resultapply版であり、タプルの要素を引数として関数を呼び出した結果の型を求める。

要件

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)...)が未評価オペランドとして扱われたときに適格であるならば、メンバ型typedecltype(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

処理系

関連項目

参照