lambda的类型是什么?

时间:2014-05-22 10:15:32

标签: c++ c++11 lambda

我见过这样的代码:

std::sort(x, x + N, 
    // Lambda expression begins
    [](float a, float b) { 
        return std::abs(a) < std::abs(b); 
    });

显然std::sort的第三个参数是一个可以保存lambda的类型。但这是什么类型的? std::sort如此严重超负荷,我无法解读它。

(我正在考虑建立一个函数列表:我正在考虑使用lambda而不是函数指针,因为后者必须具有大致相同的参数列表。)

我想我可以写

auto letTheComplerSortOutTheType =
        [](float a, float b) { 
            return std::abs(a) < std::abs(b); 
        });

但在使用容器方面,这对我没有帮助。

1 个答案:

答案 0 :(得分:6)

lambda的类型是 unique ,编译器已知。在您的代码中,std::sort是一个函数模板,其第三个参数是模板参数,它是由编译器推导出来的,用于传递给函数的lambda。

通常你不需要知道lambda的类型,因为它是由编译器为你定义的,如下所示:

//generated by the compiler
struct __unique_lambda_defined_by_compiler  //arbitrary ugly name!
{
       bool operator()(float a, float b) const { 
                return std::abs(a) < std::abs(b); 
       }
};

因此,您的代码转换为:

//translated by the compiler
std::sort(x, x + N, __unique_lambda_defined_by_compiler());

注意,如果你想拥有一个lambda(和函数指针!)的容器,那么你可以使用std::function来删除lambda(和函数指针)的类型,如下所示:

 std::vector<std::function<bool(int,int)>> callbacks;

 callbacks.push_back([](int, int) { ... });  //the lambda must return bool
 callbacks.push_back([](int, int) { ... });
 callbacks.push_back([](int, int) { ... });

 bool compare(int,int) { ... } 

 callbacks.push_back(compare); //store normal function as well!