Skip to content

Latest commit

 

History

History
137 lines (110 loc) · 5.11 KB

apply.md

File metadata and controls

137 lines (110 loc) · 5.11 KB

apply

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

  template<class F, tuple-like Tuple>
  constexpr decltype(auto)
    apply(F&& f, Tuple&& t) noexcept(see below); // (1) C++23
}
  • tuple-like[link tuple-like.md]
  • tuple-like[link tuple-like.md]
  • see below[italic]

概要

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

要件

適用先の関数はCallable要件を満たす(INVOKE操作が可能)。展開されるTuple型はstd::tupleに限定されず、std::arrayまたはstd::pairのように、std::getstd::tuple_sizeをサポートする型であればよい。(C++20 まで。)C++23 ではtuple-likeによる制約が追加されたため、使用できる型は狭まった。(tuple-like参照)

効果

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

// C++17
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))...);
}

// C++23
template<class F, tuple-like 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::get[link tuple/get.md]
  • std::index_sequence[link /reference/utility/index_sequence.md]
  • std::invoke[link /reference/functional/invoke.md]
  • std::forward[link /reference/utility/forward.md]

C++17 : 次と等価である。

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

C++20 : 次と等価である。

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::tuple_size_v[link tuple_size.md]
  • std::make_index_sequence[link /reference/utility/make_index_sequence.md]
  • std::forward[link /reference/utility/forward.md]
  • std::remove_reference_t[link /reference/type_traits/remove_reference.md]

戻り値

適用した関数呼び出しの戻り値

例外

C++23から : Iをパラメータパック0, 1, ..., (tuple_size_v<remove_reference_t<Tuple>>-1)としたとき、例外指定の式は次と等価 : noexcept(invoke(std::forward<F>(f), get<I>(std::forward<Tuple>(t))...))

#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

処理系

関連項目

参照