我见过这样的代码:
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);
});
但在使用容器方面,这对我没有帮助。
答案 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!