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<string(int const&)> fn = [] (int x) { return string(x,'X'); };
vector<string> 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<typename T, typename Func>
std::vector<typename std::result_of<Func(T)>::type>
map(const std::vector<T> &v, Func f) {
// ...
}
Another version of the same idea, using decltype
and declval
instead of result_of
template<typename T, typename Func>
std::vector<decltype(std::declval<Func>()(std::declval<T>()))>
map(const std::vector<T> &v, Func f) {
// ...
}
Finally, using a trailing return type
template<typename T, typename Func>
auto map(const std::vector<T> &v, Func f)
-> std::vector<decltype(f(v[0]))> {
// ...
}
Live demo
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…