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

公司手机网站建设武汉seo优化

公司手机网站建设,武汉seo优化,网站暂时关闭怎么做,威海市建设局网站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://www.wooajung.com/news/22169.html

相关文章:

  • bl做视频网站外贸推广营销公司
  • app设计素材网站青岛seo外包服务
  • 做简历网站网站首页布局设计模板
  • 用美国服务器做中国盗版网站花生壳免费域名注册
  • 做旅行的网站网站seo运营
  • 重庆潼南网站建设价格做seo需要哪些知识
  • 广州网络兼职网站建设广州百度seo 网站推广
  • 中企动力技术支持网站武汉网站关键词推广
  • 青岛做网站的公司优化大师客服
  • wdcp 网站日志冯站长之家官网
  • 泰安手机网站建设公司seo兼职工资一般多少
  • 购物网站优化的建议阿亮seo技术
  • nas 做网站服务器合肥优化
  • 如何用百度云文件做网站seo信息是什么
  • 高端网站建设网站定制深圳推广优化公司
  • 网页设计教程这本书讲什么专业的网站优化公司
  • 我想做个卷帘门网站怎么做百度云手机app下载
  • 美国有哪些做促销的网站seo外链技巧
  • 做网站工具惠州seo公司
  • wordpress能做手机站吗疫情二十条优化措施
  • 商城类网站建设为什么不能去外包公司
  • 西安做网站陕西必达线上平台推广方式
  • 深圳网站建设黄浦网络网站推广怎么做才有效果
  • wordpress 浏览次数青岛网站制作seo
  • wordpress4.9 多站点北京企业网站seo平台
  • 可以做微课ppt模板 网站有哪些内容微信小程序开发一个多少钱啊
  • 特色的合肥网站建设seo在线优化工具
  • 美国购物网站网站建设方案推广
  • wordpress做图集百度seo网站优化 网络服务
  • 公司网站建设改版百度指数是干嘛的