Skip to content

Latest commit

 

History

History
100 lines (78 loc) · 3.11 KB

apply.md

File metadata and controls

100 lines (78 loc) · 3.11 KB

apply

  • tuple[meta header]
  • function[meta id-type]
  • std[meta namespace]
  • cpp17[meta cpp]
namespace std {
  template<class F, class Tuple>
  constexpr decltype(auto) apply(F&& f, Tuple&& t);
}

概要

タプルを展開し、関数の引数に適用してその関数を実行する。

要件

適用先の関数はCallable要件を満たす(INVOKE操作が可能)。展開されるものは、std::tuplestd::arrayまたはstd::pairのように、std::getstd::tuple_sizeをサポートする必要がある。

効果

次のような関数があるとき、

template<class F, class Tuple, size_t... I>
constexpr decltype(auto) apply-impl(F&& f, Tuple&& t, std::index_sequence<I...>) {
  return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
}
  • std::index_sequence[link /reference/utility/index_sequence.md]
  • std::invoke[link /reference/functional/invoke.md]
  • std::forward[link /reference/utility/forward.md]

次と等価である。

return apply-impl(std::forward<F>(f), std::forward<Tuple>(t),
                  std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
  • std::make_index_sequence[link /reference/utility/make_index_sequence.md]
  • std::remove_reference_t[link /reference/type_traits/remove_reference.md]

戻り値

適用した関数の戻り値である。

#include <iostream>
#include <tuple>
#include <string>

void f(int a, double b, std::string c)
{
  std::cout << a << std::endl;
  std::cout << b << std::endl;
  std::cout << c << std::endl;
}

int main()
{
  std::tuple<int, double, std::string> args(1, 3.14, "hello");
  std::apply(f, args);
}
  • std::apply[color ff0000]

出力

1
3.14
hello

バージョン

言語

  • C++17

処理系

関連項目

参照