namespace std {
template<class F, class... Is>
requires (indirectly_readable<Is> && ...) &&
invocable<F, iter_reference_t<Is>...>
using indirect_result_t = invoke_result_t<F, iter_reference_t<Is>...>;
}
概要
関数呼び出し可能な型F
に間接参照可能な型(主にイテレータ型)Is...
の指す要素を渡して呼び出した時の戻り値型を取得する。
例
#include <iterator>
#include <vector>
#include <string>
int main() {
using vec_iterator = std::vector<int>::iterator;
using pointer = double*;
using lambda1 = decltype([](int) -> std::size_t { return 0;});
using lambda2 = decltype([](double) -> int { return 0;});
using lambda3 = decltype([](int, int, double, double) -> std::string { return "";});
static_assert(std::same_as<std::indirect_result_t<lambda1, vec_iterator>, std::size_t>);
static_assert(std::same_as<std::indirect_result_t<lambda2, pointer> , int>);
static_assert(std::same_as<std::indirect_result_t<lambda3, vec_iterator, const vec_iterator, pointer, const pointer>, std::string>);
}
出力
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 6 ✅