Есть две проблемы, связанные с тем, как вы хотели бы передавать потрясающие материалы. Первый тривиален, другой несколько более сложен. Код, который вы показали, не может работать, так как вы пытаетесь вызвать fabs и передать результат в std :: аккумуляцию (с плавающей запятой или double):
std::accumulate(vec.begin(), vec.end(), 0, std::fabs()); //note the parens ()
Так что, если std :: fabs была просто одной функциейи использовал правильную подпись, это сработало бы:
std::accumulate(vec.begin(), vec.end(), 0, std::fabs);
Тем не менее, как можно видеть здесь , fabs перегружен на float, double и long double, означая, что std :: fabs являетсянабор перегрузки, а не одна функция, и поэтому не ясно, какие версии адресов вы хотели бы передать. На эту часть вопроса есть ответ: Как указать указатель на перегруженную функцию?
Кроме того, как указано в комментариях и других ответах, накапливается последний параметр, ожидающий двоичный файлОперация, объединяющая два значения, тогда как fabs принимает абсолютное значение только один. Правильный алгоритм для использования в C ++ 17 transform_reduce :
std::transform_reduce(vec.begin(), vec.end(),0,std::plus<>{}, static_cast<double (*)(double)>(std::fabs));