使用多个输入向量中的值的笛卡尔积来调用lambda

Ste*_*mer 6 c++ lambda templates variadic-templates c++14

我有几个ints或doubles的向量:

std::vector<int>    iv = { 1, 2, 3, 4 };
std::vector<double> jv = { .5, 1., 1.5, 2. };
std::vector<int>    kv = { 5, 4, 3, 2 };
Run Code Online (Sandbox Code Playgroud)

我需要处理每个向量的笛卡尔积:

for (int i : iv)
{
    for (double j : jv)
    {
        for (int k : kv)
        {
            process(i, j, k);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想把它变成一个电话

product(iv, jv, kv, [=](int i, double j, int k)
    {
        process(i, j, k);
    });
Run Code Online (Sandbox Code Playgroud)
  • 输入向量的数量是可变的
  • 存储在输入向量中的类型是可变的

这可能吗?(我正在使用C++ 14)

Bar*_*rry 6

这是一个简短的递归版本,只适用于任何迭代.const&为简单起见,它需要一切:

template <typename F>
void product(F f) {
    f();
}

template <typename F, typename C1, typename... Cs> 
void product(F f, C1 const& c1, Cs const&... cs) {
    for (auto const& e1 : c1) {
        product([&](auto const&... es){
            f(e1, es...);
        }, cs...);
    }   
}
Run Code Online (Sandbox Code Playgroud)

这将是:

product(process, iv, jv, kv);
Run Code Online (Sandbox Code Playgroud)