有没有办法在不使用递归的情况下获取参数包中的值?

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" 。