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

富德生命人寿保险公司官方网站保单查询国外网站设计版式欣赏

富德生命人寿保险公司官方网站保单查询,国外网站设计版式欣赏,响应式网站管理系统,wordpress推送百度升级序 个人发现很多国外的大佬的演讲或者文章都很不错#xff0c;但是鲜有人来进行分享#xff0c;届后本人会时不时拿一些看起来很好的东西来给大家分享#xff0c;主要也是搬运#xff0c;不过也省去了大家去读英文的麻烦#xff0c;同时文章中也会参杂着一些自己的见解。…序 个人发现很多国外的大佬的演讲或者文章都很不错但是鲜有人来进行分享届后本人会时不时拿一些看起来很好的东西来给大家分享主要也是搬运不过也省去了大家去读英文的麻烦同时文章中也会参杂着一些自己的见解。 本文来自于CppCon 2014: Walter E. Brown的一篇演讲 Modern Template Metaprogramming现代模板元编程我尽可能对这篇演讲进行还原。演讲通过比较多的例子的挨个讲述使得听众可以充分的理解元编程的奥秘演讲非常精彩希望我的传达可以有所体现。 如有需要可以关注微信公众号0号程序员 元编程 元编程的意思是用来产生新代码的代码而且新产生的代码实现了我们真正想要的功能通常名词“元编程”暗示了一种自反的属性。演讲中选取的例子也基本来自于标准库方便理解和了解标准库。 演讲花了一些篇幅做自我介绍同时介绍了作者的一些共享大家感兴趣可以去了解这里不展开说。 C的模板元编程是使用模板实例化驱动的编译期编程的方式这样可以提升代码灵活性及运行期的性能。那也就是意味着不存在可变性不存在虚函数不存在rtti等特性。 以下讲述中的元函数可以分为值元函数和类型元函数两种。 使用以struct为基础封装元函数 templateint N struct abs {static_assert(N ! INT_MIN);static constexpr int value (N 0) ? -N : N; };// call int const n 12; absn::value;展示了一个编译期求绝对值的元函数的例子首先接受模版参数是非类型的要保证N数值能够在编译期确定然后使用静态断言保护N不为最小值因为int的最小值无法取得他的相反数(int的取值范围是-2^31 ~ 2^31-1) 。最后使用value存放到N的绝对值。 使用constexpr函数来改写一个这个元函数 constexpr int abs(int N) { return (N 0) ? -N : N; } 这样做的好处是可以像调用正常函数那样调用一个元函数更加符合人类的思维但是使用struct封装的元函数能够提供比较多的工具使用比如说一些公开成员的类型声明using/typedef形容公开的成员数据声明static const/constexpr形容这个是constexpr函数做不到的。 这里其实就是类型的萃取类型元函数已经值元函数的封装了且这两个可以兼顾。除此之外还可以公开成员模板比如上边例子的static_assert。 以上特性会非常有用以gcd最大公约数为例 templateunsigned M, unsigned N struct gcd {static int const value gcdN, M % N::value; };templateunsigned M struct gcdM, 0 {static_assert(M ! 0); // gcd(0,0) undefinedstatic int const value M; };使用编译期递归及模板的偏特化来实现使用static_assert保护M不为0使用static int const value来存放最终的取值。这里本人来看其实目前c的constexpr元函数也可以做到不过上边所说的提供的工具等确实是无法替代的。的确标准库的实现也都是基于此struct封装来做到的。 元函数概述 以类型为参数的元函数 之前所比较常见的则是sizeofsizeof以类型为参数可以知道该类型所占内存的大小。 但是我们也可以使用类型为参数来写我们的代码以求一个数组的层级维度为例 templateclass T struct rank {static size_t const value 0; };templateclass U, size_t N struct rankU[N] {static size_t const value 1u rankU::value; };// call using array_t int[10][20][30]; rank1array_t::value // 3brown这里讲述了一个方法论一般这里需要两部分一部分是比较常规的或者递归的结束条件也就是上边中的主模板另一部分就是所谓正常处理实现也就是上边的模板特化部分。 这里计算数组的层级中将最后一维使用N特化出来这样U就可以表示前几维如此就是U的维数加1就可以递归获得维度。 以类型为结果的元函数 可以产出类型作为结果比如说移除掉类型的const修饰符: templateclass T struct remove_const {using type T; };templateclass U struct remove_constU const {using type U; };// call remove_constT::type t;remove_const可以做到移除掉类型的const如上主模板比较通用的输入任何类型都返回该类型特化的这个模板实现比较巧妙仅仅接收const修饰的类型为入参然后正好返回去掉了const的类型。 C11标准库元函数惯例1 C标准库中一般来说如果是以类型为结果的话都是用type来给它命名算是一个约定。介于一些历史原因标准库中的类型结果不都是以type命名比如说到的iterator_traits中。 type_is 然后brown说到元函数type_is他说到这是一个比较特殊的元函数 templateclass T struct type_is {using type T; };我们看起来平平无奇仅仅是把入参直接作为结果但这也是他的特殊之处。在其他元函数对其继承时出奇的好用 templateclass T struct remove_volatile : type_isT { };templateclass U struct remove_volatileU volatile : type_isU { };remove_volatile类似于remove_const实现不同的是继承了type_is同时传递类型参数也就是说可以直接指定结果类型是哪个并且省掉了写using type xxx是不是方便了很多。 决策标记 假设你要设计一个IF/IF_t的元函数如果满足条件则返回一个类型不满足返回另外一个类型这整个发生在编译期。如何做到呢可以先尝试自己写写首先要有一个主模板还有一个特化模板 templatebool, class T, class F struct IF : type_isT {};templateclass T, class F struct IFfalse, T, F : type_isF {};实现真的够简单优美假设主模板的bool值是true这样结果就是T类型如果特化bool的值为false时就返回F类型。也就是C11的conditional。C14后增加了xxxx_t表示xxxx::type。也就是说conditional_t表示conditional::type更加方便。 那么再次想象你可能需要这样一种场景如果传递给你的bool值是true就返回指定类型否则什么也不返回或者说什么也不做 templatebool, class T struct enable_if : type_isT {};templateclass T struct enable_iffalse, T {};借助上边的一个一个例子很容易就实现了。主模板默认bool值是true就返回T类型。特化模板是false那么就什么也不做。 enable_if是不是很熟悉没错的就是标准库中的enable_if。那么这样的一个元函数他有什么用呢 当调用到enable_iffalse,...::type时是个错误吗?这里就可以使用在SFINAE了。通过一些重载机制使得enable_if做到替换失败不是错误进行重载决议选择最合适的函数执行。 我的之前文章也讲过的SFINAE了不过brown花了一些时间对于此讲解我们也来转述一下。 SFINAE应用于模板的隐式实例化过程中在模板的实例化过程中分几步进行 计算出模板参数 优先使用模板函数调用时显示指定的参数否则从函数参数推断否则从默认模板参数使用 使用相应的参数替换模板参数 如果这些步骤可以产出格式正确的的代码则实例化成功。 如果产生的代码格式是不正确的也就是替换失败则该函数就会从候选集里丢弃。 SFINAE使用 templateclass T enable_ifis_integralT::value, maxint_t f(T val) {}templateclass T enable_ifis_floating_pointT::value, long double f(T val) {}enable_if应用在函数的返回值上如果调用f传递是int则调用第一个函数传递float则调用第二个。但是不论是传递int或者float都会有一个函数会实例化失败但是这并不是错误仅仅是从候选集中移除从而选择正确的一个。 某种程度上来讲enable_if和concept类似concept有着坚实的数学基础。brown也仅仅是一个尝鲜目前concept在C20引入。 C11标准库元函数惯例2 当一个元函数返回一个值时以值为结果使用value为其命名大部分使用static constexpr修饰。一个典型值元函数的例子是: templateclass T, T v struct integral_constant {static constexpr T value v;constexpr operator T() const noexcept {return value;}constexpr T operator()() const noexcept {return value;} };是一个常数元函数仅仅是对其入参的值进行了封装并作为结果这个和type_is类似的地方是他也可以作为其他值元函数的父类免去了重新对value进行编码及相关函数的编写。 再次看下rank templateclass T struct rank : integral_constantsize_t, 0 {};templateclass U, size_t N struct rankU[N] : integral_constantsize_t, 1u rankU::value {};现在有了integral_constant就可以很方便的对rank进行封装写法及思路基本上没有变化仅仅是将vale和类型传给integral_constant来管理那也就是说我的最终值结果传递integral_constant就做好了一切。 使用integral_constant的一些便利 templatebool b using bool_constant integral_constantbool, b;using true_type bool_constanttrue; using false_type bool_constantfalse;bool_constant就是类型为bool的常数然后借此有可以封装了true_type和false_type也就是说true_type或者false_type就是值结果为true和false的元函数。 is_voidT::value bool(is_voidT{}) is_voidT{}(); is_void_vT // c14这是几种获取到value结果的调用方式is_void返回一个value可以使用::value调用或者实例化对象获取或者调用()操作符调用这些在integral_constant都有提供。xxx_v的形式在c14中提供和xxx_t类似也即对xxx::value的封装。 使用模板特化及继承 这里继续使用继承及特化一起的形式来展示给大家一些例子 is_void 假设要实现一个判断类型是不是void的元函数呢 templateclass T struct is_void : false_type {};template struct is_voidvoid : true_type {}; template struct is_voidvoid const : true_type {}; ...这里假设主模板中传递的类型不是void所以让他来继承false_type也就是说这里他的返回值是false。然后就是模板的特化了这里只是特化了两个形式一个是void一个是void const这两种类型的参数都会被判断成返回值是true。这里也是我们第一次继承true_type和false_type当需要设定返回值是bool值时便可以参照如此来继承。 is_same 假设要实现一个判断传递的两个类型参数是否相等的元函数呢这里大家可以设想一下自己的实现来和下边实现比对 templateclass T, class U struct is_same : false_type {}; templateclass T struct is_sameT, T : true_type {};主模板时传递两个类型的模板参数默认是false的然后看特化版本仅仅是特化出来两个一样的类型的元函数的版本为true简单且完美。到这里大家可以想象是不是自己也可以写出类似的函数了虽然和我们平时写的代码不一样但是原理很像假设我们写if T U 则为true否则则为false抽象成元函数时我们只能特化相等的情况因为这种情况是已知的。 使用is_same实现is_void 那么我们如果使用is_same再次实现is_void呢 templateclass T using is_void is_sameremove_cv_tT, void;// remove_cv_t templateclass T using remove_cv remove_volatileremove_const_tT;templateclass T using remove_cv_t typename remove_cvT::type ;实现也比较简单就是将T与void比较这里就是多了将类型T的const及volatile修饰去掉再此比较下边也有remove_cv的实现前边也讲过比较容易理解。 元函数中使用参数包 从这里开始我们将模板参数是参数包的情况下的一些例子。 is_one_of 首先是判断一坨类型参数包中是否包含某个类型参数 templateclass T, class... P0toN struct is_one_of;templateclass T struct is_one_ofT : false_type {};templateclass T, class... P1toN struct is_one_ofT, T, P1toN... : true_type {};templateclass T, class P0, class... P1toN struct is_one_ofT, P0, P1toN... : is_one_ofT, P1toN... {};这个实现稍微有点复杂但是也是很巧妙。首先仅仅是对is_one_of声明不做实现然后第一个特化版本是就一个T类型也就是说参数包是空的那当然是返回false了。第二个特化版本是要找类型刚好在参数包的第一个那自然返回true。第三个版本是表示不在第一个情况下那就先把第一个分离出来P0让T和其他的剩下的类型比较也即继承is_one_ofT, P1toN...这样递归继承就始终判断是不是在第一个就可以了如果找了半天没有就回到第一个特化版本了。 使用is_one_of实现is_void templateclass T using is_void is_one_ofT,void,void const,void volatile,void const volatile;就比较简单判断下传递过来的T是不是其中的任何一个完美。 不做求值的操作符 brown谈到一些未求值的操作符包含sizeoftypeiddecltypenoexcept也就是说这些操作符要操作的表达式时是不对表达式求值的。举例说明decltype(foo()) 中的表达式是foo的函数调用其实不会真的去调用这个函数仅仅是对这个函数的签名等做检查那么这里就是检查这个函数的返回值类型。 那么由于此特性结合std::declval()可以一起使用。 decltype((std::declvalint())); // **std::declval()**是一个函数模板他仅仅只有声明没有实现你唯一可以使用他的地方是在没有定义的未求值的上下文中。作用是看起来像是一个函数调用但是不去调用且返回值为T的右值引用。如果想要返回值是左指的话传递参数为T即可。 is_copy_assignable 先来看一个应用判断某个类型的是否可以拷贝也即等号操作符是不是可以调用 templateclass T struct is_copy_assignable { private:templateclass U, class decltype(declvalU() declvalU const())static true_type try_assignment(U);static false_type try_assignment(...);public:using type decltype(try_assignment(declvalT())); };看起来有点复杂我们一步一步解析首先可以看到有两个重载函数try_assignment第一个是返回值是true_type第二个是false_type。那也就是说第一个是表示可以对拷贝操作符调用。他是如何知道的呢 decltype(declvalU() declvalU const())这句是关键这里就是去获取等号操作符函数的返回值使用declval来调用等号操作符但是仅仅是声明没有真正调用这里是将一个U const的对象赋值给U的形式也即等号的签名形式。第二个重载版本就很简单参数就是三个点表示最坏的匹配其他重载函数找不到就找它。 最后看is_copy_assignable的type也即对外的返回类型其实就是检查try_assignment的返回值而已这样如果可以对等号调用就返回true_type否则就是false_type。 上边是C11之后的实现brown这里也提到了C11之前对此的实现思路几乎一致不够有点丑陋。还无法使用true_type和false_type时使用typedef char (yes)[1]及typedef char (no)[2]来代替及使用char[1]数组表示yeschar[2]数组表示no这里也就是返回的类型使用sizeof这个返回值类型来区别。即sizeof(try_assignment(...))不过这里他没说到declval的替代方案是什么。 void_t 接下来就是大名鼎鼎的void_t了brown花了很大的篇幅来讲述这个只能用精美绝伦的来形容当时在场的听众也是极为赞赏。 templateclass... using void_t void; 这就是实现及其简单优雅表述的意义是接收多个参数表示的类型就是void。也就是无论你传给我啥类型我就给你返回一个确定的类型。 那大家可能会想这会有啥用呀我自己都可以实现继续往下看。 假设需要实现一个检查一个类里是否有某个type的成员 templateclass, class void struct has_type_member : false_type{};templateclass T struct has_type_memberT, void_ttypename T::type : true_type{};// call has_type_memberT::value主模板默认是没有的没什么好说。关键在与特化版本这里使用void_t包装里T::type重点是T::type是否可以正常调用如果是则就是返回true_type否则就会回到第一个主模板那里了SFINAE。 那也就是说void_t反而成了会检查传递给他的类型是不是合法的功能了如果合法那就返回void不然就行不通。666 再次实现is_copy_assignable 有了void_t了brown再次实现is_copy_assignable来看 templateclass T using copy_assignment_t decltype(declvalT() declvalT const());templateclass T, class void struct is_copy_assignable : false_type {};templateclass T struct is_copy_assignableT, void_tcopy_assignment_tT: is_samecopy_assignment_tT, T {};首先需要一个表达格式让void_t去检查这里是单独拿出来的copy_assignment_t实现我们上边见过就是对等号操作符的调用声明切copy_assignment_t还会获取到等号操作符的返回值。 然后开始is_copy_assignable主模板是默认false特化模板同上边实现基本一致就是void_t中会去检查copy_assignment_t是否合法这里合法后还会再次校验返回值是不是T如此便是true_type否则就会到主模板那里false_type。 相信到这里大家也明白了void_t的用法也就是它可以做到去校验传递给他的调用得出类型或者表达式等等是否是合法的。如果需要的是is_move_assignable仅仅把copy_assignment_t那里的T const换成T。 演讲到这里有一个clang标准库维护的嘉宾说他也需要一个这样的东西实现了一个is_well_form但是他的实现相比较起来有限的多回家要把它撕了。哈哈哈。 技巧及工具总结 这里就是做了一下总结brown讲到前边说了类型的元函数使用static const/constexpr的值元函数及元函数的使用继承特化等等技术以及SFINAE未求值操作符参数包的元函数以及void_t等等。 brown最后用一段话结束演讲我把它贴到这里 Although were professionals now, we all started out as humble students - .... Back then, everything was new, and we had no real way of knowing whether what we were looking at was wizardry or WTF到此就结束了希望我的搬运能给大家带来知识腰酸背痛点个赞吧 ref https://www.youtube.com/watch?vAm2is2QCvxYlistPLHTh1InhhwT7esTl1bRitiizeEnksGU7Jindex64https://www.bilibili.com/video/BV1JK4y1D7Yz/?spm_id_fromautoNextvd_source1f66d9ea5af0d60321b7aa0c6bd28d66
http://www.pierceye.com/news/134250/

相关文章:

  • 学生免费建设网站建设网站是否等于开展网络营销
  • 旅游网站结构图网站编程图
  • 达内网站开发培训价格安装百度到手机桌面
  • 网站服务器慢建站设计网站
  • wordpress 多站点 插件怎么做网站主页设计
  • 网站建设初稿wordpress删除自豪的
  • 某网站突然不能浏览了网站不备案能用吗
  • 厦门做个网站多少钱360建筑网官网下载
  • 镇江外贸网站建设电子工程王粟
  • 申请网站建设经费wordpress做商城网站
  • google下载app西安分类信息seo公司
  • 淘宝是什么语言做的网站手机网站开发+手机模拟器
  • 视频网站开发框架小说类网站功能建设
  • 网站规划与设计案例网站建设方案设计
  • 漯河网站建设费用成都网站建设重庆最加科技
  • 莱芜 网站wordpress 关闭警告
  • 深圳做棋牌网站建设哪家技术好建设一个网站的规划
  • 网站开发流程比较合理网站已经申请了域名 接下来怎么
  • 校园电商平台网站建设网站网址模板
  • 沈阳有资质做网站的公司温州做网站定制
  • wordpress codex网站seo和sem是什么意思
  • 建网站平台哪家好装修设计软件app排行
  • 网站开发文档撰写企业管理培训课程图片
  • 网站开发公司资质wordpress文章管理模板
  • 建筑网站知识大全江苏有哪些网站建设的公司
  • 江汉网站建设用js做网站登录
  • wordpress做购物网站河南省建设工程造价协会网站
  • wex5可以做网站吗爱射影院网站建设中
  • 网站建设多选题百度文库做好中心网站建设工作总结
  • 网站开发都用phpwordpress文章内图片幻灯片