在没有 std::index_sequence 的人工层的情况下就地解压 std::tuple
Unpack std::tuple in-place without the artificial layer for std::index_sequence
我有一个函数模板:
template <typename... Us>
void set_args(const void* p, Us&... args);
我有一个 std::tuple
,我想解压缩到 args
。我目前的解决方案是
template <typename... Us, std::size_t... Idx>
void set_args_2(
const void* p, std::tuple<Us...>& args, std::index_sequence<Idx...>) {
set_args(p, std::get<Idx>(args)...);
}
template <typename... Us>
void func(std::tuple<Us...>& args, ...) {
...
set_args_2(p, args, std::index_sequence_for<Us...>{});
...
}
注意人工 set_args_2()
纯粹是为了让 Idx
解包元组。有没有办法就地解包元组 func()
,以便可以直接调用 set_args()
?
C++17 介绍 std::apply:
std::apply([&](auto&&... args) {
set_args(p, std::forward<decltype(args)>(args)... );
}, args);
我有一个函数模板:
template <typename... Us>
void set_args(const void* p, Us&... args);
我有一个 std::tuple
,我想解压缩到 args
。我目前的解决方案是
template <typename... Us, std::size_t... Idx>
void set_args_2(
const void* p, std::tuple<Us...>& args, std::index_sequence<Idx...>) {
set_args(p, std::get<Idx>(args)...);
}
template <typename... Us>
void func(std::tuple<Us...>& args, ...) {
...
set_args_2(p, args, std::index_sequence_for<Us...>{});
...
}
注意人工 set_args_2()
纯粹是为了让 Idx
解包元组。有没有办法就地解包元组 func()
,以便可以直接调用 set_args()
?
C++17 介绍 std::apply:
std::apply([&](auto&&... args) {
set_args(p, std::forward<decltype(args)>(args)... );
}, args);