gpt4 book ai didi

c++ - 可变参数模板 : unfold arguments in groups

转载 作者:行者123 更新时间:2023-12-01 22:11:03 27 4
gpt4 key购买 nike

我有一个带有两个参数的函数:

template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }

还有一个应该成对转发其参数的可变参数:

template <typename... Args>
void bar(Args&&... args) {
static_assert(sizeof...(Args) % 2 == 0);

( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... );
// ^ Sends each argument twice, not in pairs
}

我想要bar(1,2,3,4)调用foo(1,2)foo(3,4)

有办法做到这一点吗?

最佳答案

您可以通过重载来完成它。

template <typename T1, typename T2>
void bar(T1&& arg1, T2&& arg2) {
foo( std::forward<T1>(arg1), std::forward<T2>(arg2) ); // (until) sends (the last) two arguments to foo
}

template <typename T1, typename T2, typename... Args>
void bar(T1&& arg1, T2&& arg2, Args&&... args) {
foo( std::forward<T1>(arg1), std::forward<T2>(arg2) ); // sends the 1st two arguments to foo
bar( std::forward<Args>(args)... ); // call bar with remaining elements recursively
}

LIVE

<小时/>

请注意,使用上面的最小代码片段,当使用 0 或奇数参数调用 bar 时,您将收到无匹配函数错误。如果您想要使用 static_assert 获得更清晰的编译消息,您可以从这个 snippet 开始.

关于c++ - 可变参数模板 : unfold arguments in groups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59018585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com