您可以在调用站点中交错可变参数吗?

问题描述 投票:0回答:1

SO是一场狗屎秀。感谢您的搭车。

c++ variadic-templates c++20
1个回答
4
投票

像这样:

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...>());
}
© www.soinside.com 2019 - 2024. All rights reserved.