最終更新日時(UTC):
が更新

履歴 編集

function
<tuple>

std::apply(C++17)

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))...);
}

次と等価である。

return 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 <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);
}

出力

1
3.14
hello

バージョン

言語

  • C++17

処理系

関連項目

参照