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 ❌