我有几个int或double的向量:
- std::vector<int> iv = { 1,2,3,4 };
- std::vector<double> jv = { .5,1.,1.5,2. };
- std::vector<int> kv = { 5,4,2 };
我需要处理每个向量的笛卡尔积:
- for (int i : iv)
- {
- for (double j : jv)
- {
- for (int k : kv)
- {
- process(i,j,k);
- }
- }
- }
我想把它变成一个电话
- product(iv,jv,kv,[=](int i,double j,int k)
- {
- process(i,k);
- });
>输入向量的数量是可变的
>存储在输入向量中的类型是可变的
这可能吗? (我正在使用C 14)
解决方法
这是一个简短的递归版本,只适用于任何迭代.它通过const& amp;为简单起见:
- 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...);
- }
- }
这将是:
- product(process,iv,kv);