我见过许多使用递归从参数包中提取值的示例代码。除了递归之外,还有什么方法可以从参数包中提取值?
问问题
312 次
3 回答
1
事实证明,它有一个解决方法。C++ 参数包扩展可用于每个循环:
#include <iostream>
template <int ... ints>
constexpr int product() {
int ret = 1;
auto _ = {
([&](int i) -> int {
ret *= i;
return i;
})(ints)...
};
return ret;
}
int main() {
std::cout << product<2, 6, 3>() << '\n';
return 0;
}
问题是:
- 以上代码仅适用于非类型模板参数包。
没有休息或继续
编辑
显然,在参数包扩展中的 lambda 中有一个 goto 是合法的。(我没有意识到这一点,因为 Clang 有一个限制 `goto` 操作数的错误)。然而,这不是一个好主意,因为它在离开 lambda 之前不会“清理”。于 2020-05-15T16:51:13.400 回答
1
您可以将所有包参数作为元组转发,然后调用get<0>
:
template<class ... Args>
void foo(Args&& ... args) {
auto&& first = std::get<0>(std::forward_as_tuple(std::forward<Args>(args)...));
}
于 2020-04-26T15:16:22.693 回答
1
根据您想要做什么,您可以使用 C++17 折叠表达式:
template <int ... ints>
constexpr int product() {
return (ints * ...);
}
于 2020-04-26T15:05:58.290 回答