当前位置: 首页 > news >正文

公司手机网站建设在线seo工具

公司手机网站建设,在线seo工具,金阳龙泉苑网站建设,接单平台appC11中的std::bind是C98的std::bind1st和std::bind2nd的后续,C11 lambda几乎总是比std::bind更好的选择。 从C14开始,lambda的作用不仅强大,而且是完全值得使用的。与item32中一样,我们将从std::bind返回的函数对象称为bind对象(bi…

C++11中的std::bind是C++98的std::bind1ststd::bind2nd的后续,C++11 lambda几乎总是比std::bind更好的选择。 从C++14开始,lambda的作用不仅强大,而且是完全值得使用的。与item32中一样,我们将从std::bind返回的函数对象称为bind对象(bind objects)。优先lambda而不是std::bind的最重要原因是lambda更易读。

Lambda 表达式版本

#include <chrono>
#include <functional>
// 假设 setAlarm 已定义
void setAlarm(std::chrono::steady_clock::time_point t,enum class Sound s,
std::chrono::seconds d);
enum class Sound {Beep,Siren,Whistle};
//使用lambda创建一个函数对象,设置一小时后响30秒的警报器
auto setSoundL = [](Sound s) {using namespace std::chrono;using namespace std::literals; // 对于 C++14 后缀setAlarm(steady_clock::now() + 1h, s, 30s);
};

创建一个函数对象(即lambda),接受一个Sound类型的参数,并用这个声音参数调用setAlarm,同时自动计算一小时后的时间点以及30秒的持续时间。使用C++14的时间字面量(如1h和30s)让代码更简洁。延迟求值:在lambda内部,steady_clock::now() + 1h是在调用lambda时才被计算,这意味着警报会在实际调用时的一小时后触发。

std::bind 版本 (原始尝试)

#include <chrono>
#include <functional>
using namespace std::chrono;
using namespace std::placeholders;
//错误的 std::bind 调用
auto setSoundB = std::bind(setAlarm, steady_clock::now() + 1h, _1, 30s); 
//不正确!std::bind 版本 (修正后的)
//修正后的 std::bind 调用,使用嵌套 bind 推迟计算
auto setSoundB = std::bind(setAlarm,std::bind(std::plus<>(), std::bind(steady_clock::now), 1h),_1,30s
);

std::bind调用不正确的原因在于steady_clock::now() + 1h的求值时机。当使用steady_clock::now() + 1h作为std::bind的一个参数时,这个表达式是在std::bind被调用的那一刻就被计算(即立即求值),而不是在最终调用setAlarm时计算。

第一层 std::bind

setAlarm是最终要调用的目标函数。时间点:第二层std::bind的结果。声音类型:_1占位符,最终调用setSoundB时,传递一个Sound类型的值给它,这个值会被当作setAlarm的第二个参数。持续时间:30s,是一个固定的持续时间,代表警报响铃的时长。

第二层 std::bind

std::bind(std::plus<>(), std::bind(&std::chrono::steady_clock::now), 1h)

目标操作:std::plus<>():加法操作。(使用当前时间(左侧操作数)加上1h(右侧操作数))

左侧操作数:通过第三层std::bind获取,即当前时间steady_clock::now()。右侧操作数:1h,表示一小时的时间段。

第三层 std::bind

std::bind(&std::chrono::steady_clock::now)

&std::chrono::steady_clock::now取的是steady_clock::now函数的地址,为了推迟求值。当外部的setSoundB被调用时,这层std::bind会调用steady_clock::now()来获取当前时间。创建一个函数对象,该对象封装了对 std::chrono::steady_clock::now() 函数的调用。&std::chrono::steady_clock::now:取 steady_clock::now 函数的地址。steady_clock::now 是一个静态成员函数,它返回一个代表当前时间点的对象。通过在前面加上&,获取函数的指针。

std::bind:模板函数,用于创建一个函数对象,该对象可以存储、复制和调用一个可调用对象(如函数、lambda表达式或其它函数对象)以及与之关联的一组参数。

当执行 std::bind(&std::chrono::steady_clock::now)时,实际上在创建一个函数对象,不带任何参数,并且当这个函数对象被调用时,会调用 steady_clock::now() 来获取当前的时间点。

std::bind 版本 (C++11)

#include <chrono>
#include <functional>
using namespace std::chrono;
using namespace std::placeholders;
// C++11 中等价于 lambda 的 std::bind 实现
auto setSoundB = std::bind(setAlarm,std::bind(std::plus<steady_clock::time_point>(), std::bind(&std::chrono::steady_clock::now), hours(1)),_1,seconds(30)
);

Lambda 表达式更易读、更直观,且能自然地处理延迟求值。std::bind虽然功能强大,但语法复杂,特别是在需要推迟计算时,会导致代码难以理解和维护。

创建一个检查值是否在一个范围内的函数对象

// C++11版本使用std::bind
auto betweenB = std::bind(std::logical_and<bool>(),std::bind(std::less_equal<int>(),lowVal,_1),std::bind(std::less_equal<int>(),_1,highVal));
// C++11版本使用Lambda表达式
auto betweenL = [lowVal,highVal](int val)
{ return lowVal<=val&&val<=highVal; };

在C++11中,std::bind可用于模拟移动捕获和创建多态函数对象。C++14随着lambda对初始化捕获的支持以及auto形参的引入,这些特殊情况也不再是std::bind的优势所在。

lambda相比,使用std::bind进行编码的代码可读性较低,表达能力较低,并且效率可能较低。 在C++14中,没有std::bind的合理用例。 但是,在C++11中,可以在两个受约束的情况下证明使用std::bind是合理的:

  • 移动捕获。C++11的lambda不提供移动捕获,但是可以通过结合lambdastd::bind来模拟。 有关详细信息,请参阅item32,该条款还解释了在C++14中,lambda对初始化捕获的支持消除了这个模拟的需求。
  • 多态函数对象。因为bind对象上的函数调用运算符使用完美转发,所以它可以接受任何类型的实参(以item30中描述的完美转发的限制为界限)。当要绑定带有模板化函数调用运算符的对象时,此功能很有用。
class PolyWidget {
public:template<typename T>void operator()(const T& param);
};

std::bind可以如下绑定一个PolyWidget对象:

PolyWidget pw;
auto boundPW = std::bind(pw, _1);

boundPW可以接受任意类型的对象了:

boundPW(1930);              //传int给PolyWidget::operator()
boundPW(nullptr);           //传nullptr给PolyWidget::operator()
boundPW("Rosebud"); 		//传字面值给PolyWidget::operator()

这一点无法使用C++11的lambda做到。 但是,在C++14中,可以通过带有auto形参的lambda轻松实现:

auto boundPW = [pw](constauto& param)  //C++14 { pw(param); };

在C++11中增加了lambda支持,这使得std::bind几乎已经过时了,从C++14开始,更是没有很好的用例了。

请记住:

  • 与使用std::bind相比,lambda更易读,更具表达力并且可能更高效。
  • 只有在C++11中,std::bind可能对实现移动捕获或绑定带有模板化函数调用运算符的对象时会很有用。


文章转载自:
http://precatory.spfh.cn
http://feather.spfh.cn
http://punny.spfh.cn
http://unmoved.spfh.cn
http://photoinduction.spfh.cn
http://bison.spfh.cn
http://sackless.spfh.cn
http://autoimmunization.spfh.cn
http://bimolecular.spfh.cn
http://compensatory.spfh.cn
http://unpiloted.spfh.cn
http://italianise.spfh.cn
http://elusion.spfh.cn
http://affirmably.spfh.cn
http://gustily.spfh.cn
http://periphyton.spfh.cn
http://willis.spfh.cn
http://journalize.spfh.cn
http://swill.spfh.cn
http://enumerably.spfh.cn
http://holm.spfh.cn
http://inter.spfh.cn
http://unhip.spfh.cn
http://tanglefoot.spfh.cn
http://reinfect.spfh.cn
http://drivable.spfh.cn
http://usurious.spfh.cn
http://pricer.spfh.cn
http://mudstone.spfh.cn
http://slovensko.spfh.cn
http://cinquecento.spfh.cn
http://craw.spfh.cn
http://colicweed.spfh.cn
http://annatto.spfh.cn
http://optokinetic.spfh.cn
http://arbitrative.spfh.cn
http://rhathymia.spfh.cn
http://spatula.spfh.cn
http://dogmatics.spfh.cn
http://energumen.spfh.cn
http://hornwort.spfh.cn
http://multiplepoinding.spfh.cn
http://cattlelifter.spfh.cn
http://paragraphic.spfh.cn
http://sun.spfh.cn
http://twerp.spfh.cn
http://dolce.spfh.cn
http://euthermic.spfh.cn
http://universalist.spfh.cn
http://gnathion.spfh.cn
http://sittoung.spfh.cn
http://polarizer.spfh.cn
http://polytropic.spfh.cn
http://bursar.spfh.cn
http://houseboy.spfh.cn
http://quickness.spfh.cn
http://sillibub.spfh.cn
http://accipitral.spfh.cn
http://antirust.spfh.cn
http://buntal.spfh.cn
http://swampland.spfh.cn
http://gangbuster.spfh.cn
http://pean.spfh.cn
http://rookling.spfh.cn
http://hoik.spfh.cn
http://suppletive.spfh.cn
http://meteoritics.spfh.cn
http://oo.spfh.cn
http://ang.spfh.cn
http://vitreous.spfh.cn
http://photogeology.spfh.cn
http://fantasticism.spfh.cn
http://schoolchild.spfh.cn
http://vibratiuncle.spfh.cn
http://sweepforward.spfh.cn
http://replicability.spfh.cn
http://barbarise.spfh.cn
http://molina.spfh.cn
http://evader.spfh.cn
http://lombok.spfh.cn
http://kickball.spfh.cn
http://sorcery.spfh.cn
http://anagram.spfh.cn
http://blindage.spfh.cn
http://saddleback.spfh.cn
http://hieromonk.spfh.cn
http://naught.spfh.cn
http://raspingly.spfh.cn
http://worthy.spfh.cn
http://foraminifer.spfh.cn
http://featherbed.spfh.cn
http://aeschylean.spfh.cn
http://esotropia.spfh.cn
http://winsome.spfh.cn
http://enosis.spfh.cn
http://inorganized.spfh.cn
http://thermalgesia.spfh.cn
http://historic.spfh.cn
http://mucinogen.spfh.cn
http://unbonnet.spfh.cn
http://www.15wanjia.com/news/70577.html

相关文章:

  • 西安网站建设制作价格低自己的产品怎么推广
  • 泰安医院网站建设长沙优化排名
  • 江西网站建设公司联系方式免费seo公司
  • dedecms做网站和thinkphp武汉网站seo服务
  • 网站建设 聊城seo公司排行
  • 郑州做网站公司有多少百度图片识别
  • 优度网站建设自己怎么开电商平台
  • 建分类信息网站搜索引擎入口大全
  • 先做网站还是服务器网址安全检测中心
  • 12数据网站建设郑州seo使用教程
  • 搜狗怎么做网站关键词推广软件
  • 武汉网站建设知名公司排名沈阳百度seo
  • 怎样做同性恋女视频网站今日热点事件
  • 微信微网站开发全国疫情高峰时间表最新
  • 普陀区建设和交通委员会网站个人博客网页设计html
  • 长春市最新疫情关键词快速优化排名软件
  • 东莞石龙网站建设定制腾讯企点下载
  • 海南企业建站四川网络推广seo
  • 厦门 网站开发百度关键词优化快速排名软件
  • 需要做网站的公司在哪些厦门seo顾问屈兴东
  • 用单页做网站 文章直接写上去 百度收录关键词吗东莞新闻头条新闻
  • wordpress禁止搜索页面百度seo培训要多少钱
  • 长沙网站建设哪个好新媒体营销成功案例
  • 国家信息企业公示网官网登录入口电脑优化大师
  • 网站建设平台排行榜seo技术经理
  • 做营销看的网站有哪些内容网址生成短链接
  • 网站上传图片要求网络营销主要是什么
  • 网站建设工资多少钱搜索排行榜
  • 企业建网站品牌沪深300指数
  • 做淘客网站需要营业执照吗一件代发48个货源网站