Ваша функция ожидает указатель на функцию, а не лямбду.
В C ++, как правило, есть 3 типа "вызываемых объектов".
- Функциональные указатели.
- Функциональные объекты.
- Лямбда-функции.
Если вы хотите использовать все это в своем интерфейсе функций, вы можете использовать std::function
:
template<typename T, typename U>
map<T,U> mapMapValues(map<T,U> old, std::function<T(T, U)> f)
{
...
}
Это позволит вызывать функцию с использованием любого из трех типов вызываемых объектов, указанных выше. Однако цена за это удобство - небольшое количество накладных расходов на вызовы функции (обычно проверка нулевого указателя, затем вызов через указатель на функцию). Это означает, что функция почти наверняка не является встроенной (за исключением, может быть, расширенного WPO / LTO ).
В качестве альтернативы, вы можете добавить дополнительный параметр шаблона, чтобы получить произвольный тип для второго параметра. Это будет более эффективным, но вы потеряете безопасность типов в используемой функции и можете привести к увеличению объема кода.
template<typename T, typename U, typename F>
map<T,U> mapMapValues(map<T,U> old, F f)