Yeh*_*oni 52 c++ lambda stl c++11
将lambda表达式视为可调用对象的"语法糖",可以表达未命名的基础类型吗?
一个例子:
struct gt {
bool operator() (int l, int r) {
return l > r;
}
} ;
Run Code Online (Sandbox Code Playgroud)
现在,[](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;
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 60
不,你不能把它放进去decltype
因为
lambda表达式不应出现在未评估的操作数中
您可以执行以下操作
auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> s(n);
Run Code Online (Sandbox Code Playgroud)
但这真的很难看.请注意,每个lambda表达式都会创建一个新的唯一类型.如果之后您在其他地方执行以下操作,t
则其类型不同s
auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> t(n);
Run Code Online (Sandbox Code Playgroud)
您可以std::function
在这里使用,但请注意,这将产生一点运行时成本,因为它需要间接调用lambda函数对象调用操作符.这里可能忽略不计,但如果你想以这种方式传递函数对象可能会很重要std::sort
.
std::set<int, function<bool(int, int)>> s([](int l, int r) { return l > r; });
Run Code Online (Sandbox Code Playgroud)
一如既往,首先代码然后配置文件:)
归档时间: |
|
查看次数: |
20906 次 |
最近记录: |