std::experimental::apply
来自cppreference.com
< cpp | experimental
<tbody>
</tbody>
| 在标头 <experimental/tuple> 定义
|
||
template< class F, class Tuple > constexpr decltype(auto) apply(F&& f, Tuple&& t); |
(库基础 TS) | |
以实参的元组调用可调用 (Callable) 对象 f。
参数
| f | - | 要调用的可调用 (Callable) 对象 |
| t | - | 将元素作为 f 的实参的元组
|
返回值
f 所返回的值。
可能的实现
namespace detail
{
template<class F, class Tuple, std::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::invoke 是 C++17 特性
}
} // 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::decay_t<Tuple>>>{});
}
|
示例
运行此代码
#include <iostream>
#include <tuple>
template<typename... Ts>
void print_tuple(const std::tuple<Ts...> &tuple)
{
std::apply([](const auto&... elem)
{
((std::cout << elem << '\n'), ...);
}, tuple);
}
int main()
{
const std::tuple<int, char> t = std::make_tuple(5, 'a');
print_tuple(t);
}
输出:
5
a
参阅
(C++11) |
创建一个 tuple 对象,其类型根据各实参类型定义 (函数模板) |
(C++11) |
创建转发引用的 tuple (函数模板) |