a的类型是什么?

What is the type of a lambda?

本文关键字:是什么 类型      更新时间:2023-10-16

我见过这样的代码:

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

显然std::sort的第三个参数是一个可以容纳lambda的类型。但是这种类型是什么呢?std::sort超负荷,我无法破译。

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

我想我可以写

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

但是当涉及到使用容器时,这对我没有帮助

lambda的类型是唯一的,编译器知道。在你的代码中,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!