I have the following template.
template
std::vector map(const std::vector &v, std::function
Your function expects an std::function argument, but you're calling it with a lambda expression instead. The two are not the same type. A lambda is convertible to std::function, but template argument deduction requires exact matches and user defined conversions are not considered. Hence the deduction failure.
Deduction does work if you actually pass an std::function to map().
std::function fn = [] (int x) { return string(x,'X'); };
vector strings = map(numbers, fn);
Live demo
One possible workaround to avoid having to specify the template arguments is to modify the function to accept any kind of callable, rather than an std::function object.
template
std::vector::type>
map(const std::vector &v, Func f) {
// ...
}
Another version of the same idea, using decltype and declval instead of result_of
template
std::vector()(std::declval()))>
map(const std::vector &v, Func f) {
// ...
}
Finally, using a trailing return type
template
auto map(const std::vector &v, Func f)
-> std::vector {
// ...
}
Live demo