Compiler does not deduce template parameters (map std::vector -> std::vector)

后端 未结 1 442
一整个雨季
一整个雨季 2020-12-06 11:29

I have the following template.

template
std::vector map(const std::vector &v, std::function

        
相关标签:
1条回答
  • 2020-12-06 12:12

    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

    0 讨论(0)
提交回复
热议问题