如何使用 iter::product 参数长度

How to user iter::product with parameter of length

在下面的代码中,我想获取长度为 n 的所有乘积,这是函数的一个参数。显然,该产品功能不适用于长度参数。当我给出一个整数时,代码不会报错。 我也想遍历产品中的所有元素并打印它们,但是它说它不能打印元组。

我该如何解决这个问题?

#include <../cppitertools-master/product.hpp>

vector<complex<double>> print_products(int n) {
    vector<complex<double>> solutions = {};
    vector<int> options = { 1, -1 };
 
    for (auto&& combination : iter::product<n>(options)) {
        for (auto&& c : combination) {
            cout << c << " ";
        }
        cout << endl;
    }
}

我在使用参数 n:

时得到的错误
no instance of overloaded function "iter::product" matches the argument list, argument types are: (std::vector<int, std::allocator<int>>)

使用 2 作为参数尝试打印组合时出现的错误:

this range-based 'for' statement requires a suitable "begin" function and none was found

iter::product<n> 要求 n 是编译时常量,但事实并非如此。

这个库有一个关于实现一个需要重复运行时计数的版本的未决问题。

元组不是可以用 for 循环的东西。 runtime-count product 的 return 值不能是元组,所以不用担心原始案例的第二个错误。

您还必须使用编译时常量索引元组。

for (auto&& combination : iter::product<2>(options)) {
    std::cout << get<0>(combination) << " " << get<1>(combination) << " " << std::endl;
}

如果你模板计数,你可以使用std::index_sequence来保存数字的编译时间序列

template <typename T, size_t... Is>
void print_product(T&& combination, std::index_sequence<Is...>) {
    (std::cout << get<Is>(std::forward<T>(combination))), ...) << std::endl;
}

template <size_t N>
void print_products() {
    vector<int> options = { 1, -1 };
 
    for (auto&& combination : iter::product<N>(options)) {
        print_product(combination, std::make_index_sequence<N>{});
    }
}