Esta función de plantilla no reconoce el tipo devuelto por la lamda, incluso especificándolo descomentando '->void'.
¿Por que sucede?
¿Qué podría hacer para sortear este problema?
#include<iostream> #include<array> template<typename T, typename S, size_t SIZE> void for_each(std::array<T,SIZE>& arr, S(*func)(int&)) { for (auto i{0}; i != arr.size(); ++i) func(arr[i]); } int main() { std::array<int, 5> five_elems{10, 20, 30, 40, 50}; for_each(five_elems, [](int& ref)/*->void*/{ref *= 2; std::cout << ref << ' '; }); //for (auto i : five_elems) // i*=2; for (const auto i : five_elems) std::cout << i << ' '; }Su for_each espera un puntero de función, pero la conversión implícita (de lambda a puntero de función) no se considerará en la deducción del argumento de la plantilla , lo que hace que la llamada falle.
Puede realizar la conversión explícitamente:
for_each(five_elems, static_cast<void(*)(int&)>([](int& ref)/*->void*/{ref *= 2; std::cout << ref << ' '; }));O
for_each(five_elems, +[](int& ref)/*->void*/{ref *= 2; std::cout << ref << ' '; });O simplemente deje de usar el parámetro de puntero de función. Puede agregar un nuevo parámetro de plantilla de tipo y luego la lambda directamente.
template<typename T, size_t SIZE, typename F> void for_each(std::array<T,SIZE>& arr, F func) { for (auto i{0}; i != arr.size(); ++i) func(arr[i]); }