我有一个功能模板:
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()
?
答案 0 :(得分:6)
C ++ 17引入了std::apply:
std::apply([&](auto&&... args) {
set_args(p, std::forward<decltype(args)>(args)... );
}, args);
答案 1 :(得分:0)
从Yakk无耻地窃取,我们定义了一些辅助函数
template<std::size_t... Is>
auto index_over(std::index_sequence<Is...>)
{
return [](auto&& f) -> decltype(auto) {
return decltype(f)(f)(std::integral_constant<std::size_t, Is>{}...);
};
}
template<std::size_t N>
auto index_upto(std::integral_constant<std::size_t, N> = {})
{
return index_over(std::make_index_sequence<N>{});
}
所有解包都可以内联完成
template<typename... Ts>
void func(std::tuple<Ts...>& tup)
{
index_upto<sizeof...(Ts)>()(
[&](auto... Is) {
set_args(p, std::get<Is>(tup)...);
}
);
}