@HTNW отметил в этом вопросе, что код операции использует std::reduce, если предоставленная лямбда была определена с большим количеством перегрузок. Может кто-нибудь привести пример реализации этой идеи?
Я нахожусь в практически идентичной ситуации и хотел бы воспользоваться преимуществами параллельных политик std::reduce вместо std::accumulate.
Я попытался создать 4 версии моей функции с каждым требуемым типом аргументов, но я не вижу, как передать все 4 из них в std::reduce. Я также пытался дать std::visit 4 лямбды, но это также не скомпилировалось.
Например, я не уверен, как компилировать следующий код:
#include <algorithm>
#include <execution>
#include <iostream>
#include <random>
#define N 100
#define seed 1
auto baz(std::pair<double,double> se, double vi){
se.first += vi;
se.second *= 1+vi;
return se;
}
auto baz(double vi, std::pair<double,double> se){
return baz(se, vi);
}
auto baz(double vj, double vi){
return std::pair(vi+vj,1.0);
}
auto baz(std::pair<double,double> se1, std::pair<double,double> se2){
se1.first += se2.first;
se1.second *= se2.second;
return se1;
}
int main(){
std::mt19937 rng(seed);
std::uniform_real_distribution<double> dist(0,1);
std::vector<double> v(N);
std::for_each(std::execution::par_unseq, v.begin(), v.end(), [&dist,&rng](double& c){ c = dist(rng); });
for(auto x : v)
std::cout << x << ", ";
std::cout << "\n";
// working accumulate code
auto foo = std::accumulate(v.begin(), v.end(), std::pair(0.0,1.0),
[](std::pair<double,double> se, double vi){
se.first += vi;
se.second *= 1+vi;
return se;
});
std::cout << foo.first << " " << foo.second << "\n";
auto bar = std::reduce(v.begin(), v.end(), std::pair(0.0,1.0), baz)
std::cout << bar.first << " " << bar.second << "\n";
}
Было бы здорово, если бы ваш вопрос был более самодостаточным.
Вам нужно создать объект, который можно вызывать со всеми 4 указанными сигнатурами. Есть разные способы сделать это, но простой способ — использовать полиморфную лямбду:
[](auto x, auto y) { return baz(x, y); }
Пример.
Пожалуйста, покажите подробнее - ваши попытки.