将lambda作为参数传递时,参数推导失败

Argument deduction fail while passing lambda as parameter

本文关键字:参数 失败 lambda 参数传递      更新时间:2023-10-16

我有我的函数;

template < typename T > 
inline 
vector<T> listIntersection (  vector<T>& v1, vector<T>& v2, function<bool(T, T)> comprarer )

当我调用这个函数时,比如:

v_intersection = listIntersection( v1, v2, []( A left, A right )
{
    return left.getNumber() < right.getNumber();
});

参数推导失败。但是,如果我使用<A>,如下所示;

v_intersection = listIntersection<A>( v1, v2, []( A left, A right )
{
    return left.getNumber() < right.getNumber();
});

程序编译。为什么模板参数推导在第一种情况下失败?

以下是不必要但完整的示例;

struct A 
{
    int a;
    A ( int in )
    {
        a = in;
    }
    int getNumber( )
    {
        return a ;
    }; 
};

template < typename T > 
inline 
vector<T> listIntersection (  vector<T>& v1, vector<T>& v2, function<bool(T, T)> comprarer )
{
    std::sort(v1.begin(), v1.end(), comprarer);
    std::sort(v2.begin(), v2.end(), comprarer);
    vector<T> v_intersection;
    std::set_intersection(v1.begin(), v1.end(),
                          v2.begin(), v2.end(),
                          std::back_inserter(v_intersection), comprarer);
    return v_intersection;
}


int main()
{
    std::vector<A> v1{1,2,3,4,5,6,7,8};
    std::vector<A> v2{    11, 13, 5,  7,  9,10};
    std::vector<A> v_intersection;
    v_intersection = listIntersection<A>( v1, v2, []( A left, A right )
    {
        return left.getNumber() < right.getNumber();
    });
    for(auto n : v_intersection)
        std::cout << n.getNumber() << ' ';
}
闭包对象不是std::function,它有一些未命名的类型。编译器无法在一个步骤中对具有未知模板参数的std::function进行隐式转换。

如果不想显式传递模板参数,可以将函数参数设置为模板参数类型,而不是提交给std::function:

template < typename T, typename Fn > 
inline 
vector<T> listIntersection (  vector<T>& v1, vector<T>& v2, Fn comprarer )
{
    //...
}