一个Lambda的类型是什么?

5

我见过这样的代码:

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); 
        });

但是这对我使用容器来说并没有帮助。


2
你可以尝试打印它; std::cout << typeid(foo).name(); - OMGtechy
如果你在调试器中运行这个程序并查看,你会看到编译器为该类型选择的一些乱码名称。每个 lambda 都是一个新的独特类型。 - David
1个回答

8

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!

啊,非常有道理。这就解释了当我悬停在lambda类型上时出现的所有那些“有趣的数字”! - P45 Imminent
1
此外,如果您想将其放入容器中,则了解可以绑定到 lambda 的类型非常有用。因此,在您的情况下,您可以(可能)使用 vector< function<bool(float,float)> >。因此,最终您实际上不需要知道确切的类型。 - dsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接