0

我见过许多使用递归从参数包中提取值的示例代码。除了递归之外,还有什么方法可以从参数包中提取值?

4

3 回答 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 回答