【发布时间】:2011-04-21 12:05:15
【问题描述】:
将 lambda 表达式视为可调用对象的“语法糖”,可以表达未命名的底层类型吗?
一个例子:
struct gt {
bool operator() (int l, int r) {
return l > r;
}
} ;
现在,[](int l, int r) { return l > r; } 是上述代码的优雅替代品(加上必要的 gt 可调用对象的创建),但有没有办法表达 gt(类型)本身?
一个简单的用法:
std::set<int, gt> s1; // A reversed-order std::set
// Is there a way to do the same using a lambda?
std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;
【问题讨论】:
-
这是我不喜欢 lambda 表达式的原因之一。假设您在代码的 20 个区域中需要相同的比较器。你会写 20 次比较器还是写一次并作为函子/函数指针传递?
-
@Donotalo:所以你是说因为在某些情况下它不是最好的解决方案,所以它永远不会成为一个好的解决方案?使用 lambdas 的原因是 oyu 通常只需要在 一个 位置使用该比较器。如果您需要它 20 次,那么我认为 任何人 都不会建议将其表示为 lambda。
-
@Donotalo:lambdas 通常很简单,可以在程序的不同位置复制粘贴;代码重用对于非平凡的函数很有用,但你不应该为它们使用 lambda
-
好的,明白了。实际上我从来没有在一个地方需要像 lambda 这样的东西。通常我为需要排序的类定义
operator<()。这就是为什么我不明白为什么需要 lambda。 -
@Donotalo:不仅如此,您还可以通过使用
std::function和适当的参数集,将 lambda 表达式绑定到变量。