std::apply
提供: cppreference.com
ヘッダ <tuple> で定義 | ||
template<class F, class Tuple> constexpr decltype(auto) apply(F&& f, Tuple&& t); | (C++17以上) | |
引数のタプルを使用して Callable なオブジェクト f
を呼び出します。
目次 |
[編集]引数
f | - | 呼び出す Callable なオブジェクト |
t | - | f への引数として使用される値を要素に持つタプル |
[編集]戻り値
f
が返した値。
[編集] ノート
タプルは std::tuple である必要はなく、 std::get と std::tuple_size をサポートしていれば何でも使用することができます。 特に std::array や std::pair を使用することができます。
[編集]実装例
namespace detail {template<class F, class Tuple, std::size_t... I>constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>){returnstd::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);}}// namespace detail template<class F, class Tuple>constexpr decltype(auto) apply(F&& f, Tuple&& t){return detail::apply_impl(std::forward<F>(f), std::forward<Tuple>(t), std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});} |
[編集]例
Run this code
#include <iostream>#include <tuple>#include <utility> int add(int first, int second){return first + second;} template<typename T> T add_generic(T first, T second){return first + second;} auto add_lambda =[](auto first, auto second){return first + second;}; int main(){// OK。std::cout<< std::apply(add, std::make_pair(1, 2))<<'\n'; // エラー、関数の型を推定できません。// std::cout << std::apply(add_generic, std::make_pair(2.0f, 3.0f)) << '\n'; // OK。std::cout<< std::apply(add_lambda, std::make_pair(2.0f, 3.0f))<<'\n';}
出力:
3 5
[編集]関連項目
引数の型によって定義される型の tuple オブジェクトを作成します (関数テンプレート) | |
転送参照の tuple を作成します (関数テンプレート) | |
(C++17) | タプルを引数として使用してオブジェクトを構築します (関数テンプレート) |
(C++17) | 任意の Callable なオブジェクトを指定された引数で呼びます (関数テンプレート) |