我最近开始研究lambdas供个人使用.我已经编写了几年了,我已经发布了多种产品,但是,我从未发现自己需要使用lambdas.我已经阅读了各种lambda问题的其他堆栈交换答案,但是我没有找到一个解释,它显示了一个非常简单的例子,它真正推动了lambdas是必要的(在某些情况下).在做了一些研究之后,我不相信lambdas的某些特定用法不能用标准函数实现,但是,这并不意味着太多,因为我的主题范围非常有限.
有人可以为lambda提供一个相当简单的用例,演示它们如何比典型函数更强大(在正确的情况下)?
Sto*_*ica 16
C++在C++ 11之前很久就完成了图灵.兰布达不是为了让一些不可能成为可能的东西.没有它们你可以做很多事情.他们在那里简化某些代码.
例如,允许动态创建标准算法库的仿函数.当然你可以自己定义一个.但这需要超出你的功能,并命名一个新类型.std::transform
作为一个例子,一个简单的调用的很多样板.
它们保持代码本地化,不需要您污染任何名称,并且一旦掌握它就很容易使用.
作为奖励,在他关于功能性C++的讨论中,Kevlin Henney将一个示例函数从一个框架简化为一个真正叫喊"使用lambda"的东西.所以从他的演讲中借一点,考虑一下命令注册功能:
void register_command(std::string cmdName, std::function<void()> f);
Run Code Online (Sandbox Code Playgroud)
您想要注册一个只打开灯泡的命令.与以下相比,您需要为自定义仿函数编写多少样板?
register_command("Turn On Light-bulb", [&light_controller]() {
light_controller.on();
});
Run Code Online (Sandbox Code Playgroud)
考虑一下,以及您个人宁愿维护的代码库.
如今,使用lambda可以完成的所有操作都可以在C ++ 03中通过用重载(通常称为“ functors”)手写一个struct
/ 来完成。那里有一个大问题:缺乏简洁性和缺乏局限性。class
operator()
想象一下将模板谓词传递给std::find_if
C ++ 03中的东西:
struct predicate
{
template <typename T>
bool operator()(const T& x) { return boop(x); }
};
void foo()
{
something(std::find_if(c.begin(), c.end(), predicate()));
}
Run Code Online (Sandbox Code Playgroud)
你需要:
定义predicate
某处,可能远离其使用位置。
有样板struct
和operator()
过载。
阅读源代码时,请跳至源代码以了解predicate
正在做什么。
将其与C ++ 14通用lambda进行比较:
void foo()
{
something(std::find_if(c.begin(), c.end(),
[](const auto& x){ return boop(x); });
}
Run Code Online (Sandbox Code Playgroud)
繁荣。一切都在本地,并且只需很少的样板。
Lambda不是魔术。它们纯粹是语法糖。但我认为,它们是“手写struct
s的语法糖”,因为“ C ++是C的语法糖”。
它们改变了您编写代码的方式,使功能范式(例如高阶函数)可行,并且可以使您的代码更强大,更安全。
归档时间: |
|
查看次数: |
3235 次 |
最近记录: |