名前空間
変種
操作

std::apply

提供: cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ(C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
apply
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
ヘッダ <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::getstd::tuple_size をサポートしていれば何でも使用することができます。 特に std::arraystd::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>>>{});}

[編集]

#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 オブジェクトを作成します
(関数テンプレート)[edit]
転送参照tuple を作成します
(関数テンプレート)[edit]
タプルを引数として使用してオブジェクトを構築します
(関数テンプレート)[edit]
(C++17)
任意の Callable なオブジェクトを指定された引数で呼びます
(関数テンプレート)[edit]
close