SO是一场狗屎秀。感谢您的搭车。
像这样:
template <size_t... indices, typename... Ts>
void foo(const Things *things)
{
std::apply([](auto...args) {
bar(args...);
}, std::tuple_cat(std::make_tuple(indices, parse<Ts>(*(things++)))...));
}
如果
bar
是 lambda 而不是函数模板,则可以直接将 bar
作为第一个参数传递给 std::apply
。
如果您想避免复制
parse<Ts>(*(things++))
的返回值,可以使用 std::forward_as_tuple
代替 std::make_tuple
。
如果
*(things++)
让您感到不舒服,另一种稍微详细的替代方法是使用 std::index_sequence
:
template <size_t... indices, typename... Ts>
void foo(const Things *things)
{
[=]<auto... Is>(std::index_sequence<Is...>) {
std::apply([](auto...args) {
bar(args...);
}, std::tuple_cat(std::make_tuple(indices, parse<Ts>(things[Is]))...));
}(std::index_sequence_for<Ts...>());
}