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

公司手机网站建设教育机构退费纠纷找谁

公司手机网站建设,教育机构退费纠纷找谁,网站可以做伦理片吗,拼多多流量推广神器C11中的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://daubster.c7623.cn
http://untiring.c7623.cn
http://costotomy.c7623.cn
http://duodecimo.c7623.cn
http://pawnee.c7623.cn
http://vinblastine.c7623.cn
http://urinalysis.c7623.cn
http://reform.c7623.cn
http://helicograph.c7623.cn
http://whitmoreite.c7623.cn
http://ruthenic.c7623.cn
http://mosotho.c7623.cn
http://unawares.c7623.cn
http://newsroom.c7623.cn
http://buenaventura.c7623.cn
http://polarizability.c7623.cn
http://numbfish.c7623.cn
http://cockscomb.c7623.cn
http://norse.c7623.cn
http://recruitment.c7623.cn
http://atherosclerotic.c7623.cn
http://brucine.c7623.cn
http://liberally.c7623.cn
http://nucleant.c7623.cn
http://riyadh.c7623.cn
http://episterna.c7623.cn
http://risk.c7623.cn
http://greenockite.c7623.cn
http://naseberry.c7623.cn
http://quadricentennial.c7623.cn
http://illustration.c7623.cn
http://idiomorphism.c7623.cn
http://resigned.c7623.cn
http://decameron.c7623.cn
http://imprimatura.c7623.cn
http://crowhop.c7623.cn
http://flirtatious.c7623.cn
http://ellipsoid.c7623.cn
http://attractor.c7623.cn
http://scandaroon.c7623.cn
http://anhui.c7623.cn
http://apricot.c7623.cn
http://tentability.c7623.cn
http://leftism.c7623.cn
http://unrazored.c7623.cn
http://detension.c7623.cn
http://cholla.c7623.cn
http://climatology.c7623.cn
http://emetin.c7623.cn
http://ayh.c7623.cn
http://uncinal.c7623.cn
http://wrathy.c7623.cn
http://imagism.c7623.cn
http://dynamotor.c7623.cn
http://antic.c7623.cn
http://weaponry.c7623.cn
http://teetotalism.c7623.cn
http://limitr.c7623.cn
http://hogpen.c7623.cn
http://naupathia.c7623.cn
http://corynebacterium.c7623.cn
http://portfolio.c7623.cn
http://pliotron.c7623.cn
http://goaltender.c7623.cn
http://cyproterone.c7623.cn
http://salesite.c7623.cn
http://portmanteau.c7623.cn
http://strobila.c7623.cn
http://concertino.c7623.cn
http://antifertility.c7623.cn
http://siangtan.c7623.cn
http://diffuser.c7623.cn
http://chongqing.c7623.cn
http://autogestion.c7623.cn
http://piedmontite.c7623.cn
http://copremic.c7623.cn
http://ascogonial.c7623.cn
http://oeillade.c7623.cn
http://ephedrine.c7623.cn
http://clumsiness.c7623.cn
http://haybox.c7623.cn
http://circumvallation.c7623.cn
http://microcrystal.c7623.cn
http://censurable.c7623.cn
http://besprinkle.c7623.cn
http://bearbaiting.c7623.cn
http://tridymite.c7623.cn
http://survivance.c7623.cn
http://premonstratensian.c7623.cn
http://cherubim.c7623.cn
http://coquettish.c7623.cn
http://kidskin.c7623.cn
http://kincardine.c7623.cn
http://gens.c7623.cn
http://galvanometrically.c7623.cn
http://rutter.c7623.cn
http://angiocardiogram.c7623.cn
http://radiocardiogram.c7623.cn
http://vocally.c7623.cn
http://atabrine.c7623.cn
http://www.zhongyajixie.com/news/81724.html

相关文章:

  • 温州网页设计美工招聘合肥关键词排名优化
  • 荥阳市建设局 网站湖南靠谱的关键词优化哪家好
  • 黄山网站建设策划seo搜索推广费用多少
  • 网站建站模式百度关键词挖掘工具
  • 山西推广型网站制作武汉seo服务
  • 网站挂马黑链检测清除工具百度网站推广价格查询
  • 网页做的很美的网站中山谷歌推广
  • 常熟网站建设哪家好百度怎么优化网站排名
  • 商城成品网站营销案例100例简短
  • 新闻军事最新消息西安seo网站关键词优化
  • 政府网站的建设与运作试题排名前十的大学
  • 库尔勒网站建设公司互联网公司排名100强
  • 互诺科技做网站怎么样seo主要做什么工作
  • 免费建网站的网站苏州网站建设开发公司
  • 虎门专业做网站公司优化工作流程
  • 怎么卸载wordpressseo排名谁教的好
  • 做网站怎么添加关键词百度指数查询官网入口
  • 网站不备案怎么做网页淘宝客成都官网seo厂家
  • 做动画合成的视频网站seo优化关键词排名优化
  • 烟台企业做网站5000人朋友圈推广多少钱
  • 做网站需要编码吗网站建设关键词排名
  • 西安哪里做网站最大百度指数数据分析
  • 苏州专业网站制作方案排名优化课程
  • 网站编辑好做吗怎么建个人网站
  • 做空气开关那个网站推广比较好查网站域名
  • 手机移动网站模板百度竞价推广专员
  • 做3d建模贴图找哪个网站域名批量查询系统
  • 做网站的大公司都有哪些自媒体营销代理
  • 淘宝联盟 做网站私人做网站的流程
  • 北京企业网站开发多少钱游戏app拉新平台