- 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::tuple
、std::array
またはstd::pair
のように、std::get
とstd::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
- Clang: 3.9.1
- GCC: 7.1.0
- ICC: ??
- Visual C++: ??
- N3802
apply()
call a function with arguments from a tuple - N3829
apply()
call a function with arguments from a tuple (V2) - N3915
apply()
call a function with arguments from a tuple (V3) - P0220R0 Adopt Library Fundamentals TS for C++17
- P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1)
- C++1z タプルを展開して関数呼び出しするapply関数 - Faith and Brave - C++で遊ぼう