有没有办法在不使用递归的情况下获取参数包中的值?
Is there a way to get the values in a parameter pack without using recursion?
我见过许多使用递归从参数包中提取值的示例代码。除了递归之外,还有什么方法可以从参数包中提取值吗?
根据自己的需要,可以使用C++17折表达式:
template <int ... ints>
constexpr int product() {
return (ints * ...);
}
您可以将所有包参数作为元组转发,然后调用 get<0>
:
template<class ... Args>
void foo(Args&& ... args) {
auto&& first = std::get<0>(std::forward_as_tuple(std::forward<Args>(args)...));
}
事实证明,它有一个解决方法。
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 之前不会 "clean up" 。
我见过许多使用递归从参数包中提取值的示例代码。除了递归之外,还有什么方法可以从参数包中提取值吗?
根据自己的需要,可以使用C++17折表达式:
template <int ... ints>
constexpr int product() {
return (ints * ...);
}
您可以将所有包参数作为元组转发,然后调用 get<0>
:
template<class ... Args>
void foo(Args&& ... args) {
auto&& first = std::get<0>(std::forward_as_tuple(std::forward<Args>(args)...));
}
事实证明,它有一个解决方法。 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;
}
问题是:
- 以上代码仅适用于非类型模板参数包。
没有中断或继续