跟我学C++中级篇—std::conjunction手动实现

一、说明

在前面学习和分析了元编程的逻辑操作。如果在C++17以前没有提供这几个逻辑模板操作应该怎么做呢?虽然已经有了轮子,但是不是可以逆向一下这个轮子,自己尝试着再造一个类似的轮子,会不会能够更好的理解其内在的实现原理和机制呢?

二、定义和实现

在这里仅以std::conjunction为例来进行逻辑模板的实现,先看一下在cppreference上的实现:

template<class...>structconjunction:std::true_type{};template<class B1>structconjunction<B1>:B1{};template<class B1,class...Bn>structconjunction<B1,Bn...>:std::conditional_t<bool(B1::value),conjunction<Bn...>,B1>{};

再看一下库中的实现:

template<typename...>struct__and_;template<>struct__and_<>:public true_type{};template<typename _B1>struct__and_<_B1>:public _B1{};template<typename _B1,typename _B2>struct__and_<_B1,_B2>:public __conditional_t<_B1::value,_B2,_B1>{};template<typename _B1,typename _B2,typename _B3,typename..._Bn>struct__and_<_B1,_B2,_B3,_Bn...>:public __conditional_t<_B1::value,__and_<_B2,_B3,_Bn...>,_B1>{};template<typename..._Bn>structconjunction:__and_<_Bn...>{};

两者的实现基本类似,都是先实现特化版本用来终止变参模板的条件(不明白可以看一下前面变参模板相关的文章),然后conditional_t来递归的处理逻辑类型值的结果。

三、实现源码及分析

下面看看用别的方法是否也可以实现类似的代码逻辑操作。看下面的代码:

#include<iostream>#include<type_traits>// 普通模板,空参数返回true_typetemplate<typename...>struct__and__:std::true_type{};// 递归特化并检查条件template<typename T,typename...Rest>struct__and__<T,Rest...>:std::integral_constant<bool,T::value&&__and__<Rest...>::value>{};// 模拟AND实现template<typename...Cond>using __and_t__=__and__<Cond...>;// 多and检测template<typename T,typename=void>structcheck_mul_attr:std::false_type{};template<typename T>structcheck_mul_attr<T,std::void_t<decltype(std::declval<T>().test()),decltype(std::declval<T>().display()),typename T::nestType>>:__and_t__<std::is_same<decltype(std::declval<T>().test()),void>,std::is_same<decltype(std::declval<T>().display()),int>,std::is_convertible<typename T::nestType,int>>{};// 测试结构体structAllAttr{//static void test(){}voidtest(){}intdisplay(){return0;}using nestType=int;};structPartialAttr{voidtest(){}using nestType=int;};structNothing{};intmain(){// 测试AND逻辑std::cout<<"all have: "<<check_mul_attr<AllAttr>::value<<std::endl;// 1std::cout<<"partial: "<<check_mul_attr<PartialAttr>::value<<std::endl;// 0std::cout<<"nothing: "<<check_mul_attr<Nothing>::value<<std::endl;// 0// 测试__and_t__std::cout<<"test and result True: "<<__and_t__<std::true_type,std::true_type>::value<<std::endl;// 1std::cout<<"test and result False: "<<__and_t__<std::true_type,std::false_type>::value<<std::endl;// 0return0;}

编译展开后的代码为:

#include<iostream>#include<type_traits>template<typename...type_parameter_0_0>struct__and__:public std::integral_constant<bool,true>{};/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::is_same<int,int>,std::is_convertible<int,int>>:public std::integral_constant<bool,true>{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::is_convertible<int,int>>:public std::integral_constant<bool,true>{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<>:public std::integral_constant<bool,true>{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::integral_constant<bool,true>>:public std::integral_constant<bool,true>{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::integral_constant<bool,false>>:public std::integral_constant<bool,false>{};#endif/* First instantiated from: insights.cpp:18 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::is_same<void,void>,std::is_same<int,int>,std::is_convertible<int,int>>:public std::integral_constant<bool,true>{};#endif/* First instantiated from: insights.cpp:43 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::integral_constant<bool,true>,std::integral_constant<bool,true>>:public std::integral_constant<bool,true>{};#endif/* First instantiated from: insights.cpp:44 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>struct__and__<std::integral_constant<bool,true>,std::integral_constant<bool,false>>:public std::integral_constant<bool,false>{};#endiftemplate<typename T,typename...Rest>struct__and__<T,Rest...>:public std::integral_constant<bool,T::value&&__and__<Rest...>::value>{};template<typename...Cond>using __and_t__=__and__<Cond...>;template<typename T,typename type_parameter_0_1=void>structcheck_mul_attr:public std::integral_constant<bool,false>{};/* First instantiated from: insights.cpp:38 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>structcheck_mul_attr<AllAttr,void>:public __and__<std::is_same<void,void>,std::is_same<int,int>,std::is_convertible<int,int>>{};#endif/* First instantiated from: insights.cpp:39 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>structcheck_mul_attr<PartialAttr,void>:public std::integral_constant<bool,false>{};#endif/* First instantiated from: insights.cpp:40 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>structcheck_mul_attr<Nothing,void>:public std::integral_constant<bool,false>{};#endiftemplate<typename T>structcheck_mul_attr<T,std::void_t<decltype(std::declval<T>().test()),decltype(std::declval<T>().display()),typename T::nestType>>:public __and_t__<std::is_same<decltype(std::declval<T>().test()),void>,std::is_same<decltype(std::declval<T>().display()),int>,std::is_convertible<typename T::nestType,int>>{};structAllAttr{inlinevoidtest(){}inlineintdisplay(){return0;}using nestType=int;};structPartialAttr{inlinevoidtest(){}using nestType=int;};structNothing{};intmain(){std::operator<<(std::cout,"all have: ").operator<<(std::integral_constant<bool,true>::value).operator<<(std::endl);std::operator<<(std::cout,"partial: ").operator<<(std::integral_constant<bool,false>::value).operator<<(std::endl);std::operator<<(std::cout,"nothing: ").operator<<(std::integral_constant<bool,false>::value).operator<<(std::endl);std::operator<<(std::cout,"test and result True: ").operator<<(std::integral_constant<bool,true>::value).operator<<(std::endl);std::operator<<(std::cout,"test and result False: ").operator<<(std::integral_constant<bool,false>::value).operator<<(std::endl);return0;}

这段代码中需要说明的std::void_t对于非正常类型是无法转换出void的,所以正常情况下就检查到了包含内部的函数或属性等。另外,还需要注意decltype(std::declval().test())这段代码,如果在T的属性中,test函数声明为静态的,则可以直接使用decltype(T::test()),否则就只能按现在的情况先使用declval在编译期生成一个对象然后再调用test函数的类型检测。
check_mul_attr多and检测默认是false_type,然后偏特化另外一个检测版本,当上面代码说明中的void成功转换后则选中这个特化版本,即可进行连续的and控制。

四、总结

重复造轮子好不好没有一个标准的答案,但如果造轮子是出于学习的目的,如果这个轮子规模不太大的情况下,一定是个好事。学习最忌的是“知其然不知其所以然”,因为这种情况下,往往无法灵活主动的有机结合各种技术解决问题。大多数情况下往往是高级的“生搬硬套”,这就会带来各种各样的问题。关键是这些问题不一定会在当下暴露出来,然而当其真正暴露出来时,就可能是一个大问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1155438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CJA | 北航罗明强教授团队:一种基于生成式人工智能的快速结构化飞行器概念设计方法

一种基于生成式人工智能的快速结构化飞行器概念设计方法 A rapidly structured aircraft concept design method based on generative artificial intelligence TONG Yao, LUO Mingqiang*, REN Shangqing, ZHANG Zheng, XING Chenguang, DU Ziliang 北京航空航天大学 航空科…

企业源代码防泄密软件,该怎么选?

当企业部署数据防泄密系统时&#xff0c;常面临一个根本矛盾&#xff1a;研发部门需要对抗高水平内部人员的技术性泄露&#xff0c;而普通办公部门则需在保障敏感文件安全的同时&#xff0c;维持高效率协作。单一的安全策略无法满足双重需求。为此&#xff0c;深信达推出 SDC沙…

计算机毕业设计springboot校园闲置交易平台 基于SpringBoot的校园二手交易系统设计与实现 SpringBoot框架下的校园闲置物品交易管理平台开发

计算机毕业设计springboot校园闲置交易平台gb3869 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着校园生活的日益丰富&#xff0c;学生群体对于闲置物品交易的需求也逐渐增…

Vue 3的中文文献

1. 官方文档&#xff08;首选&#xff09; Vue 3 官方中文文档 最权威的参考资料&#xff0c;涵盖核心概念、API详解、迁移指南等&#xff0c;适合系统学习。 2. 书籍推荐 《Vue.js 3.x 从入门到实战》&#xff08;电子工业出版社&#xff09; 全面讲解Vue 3基础与进阶技术&a…

从资产到智能:数据如何重塑企业估值与增长模型

——数据如何成为企业的生产要素、核心资产与智能引擎在数字经济全面渗透的时代&#xff0c;企业数字化早已不是“上系统”“建平台”的简单工程&#xff0c;而是一场面向未来的底层重构。数字化的核心不是技术&#xff0c;而是&#xff1a;让数据成为新的生产力。如果数据不能…

C++ 中仿函数和函数对象这两个术语的区别

先明确核心定义 1. 本质&#xff08;通用理解&#xff09; 无论是 “仿函数” 还是 “函数对象”&#xff0c;本质都是&#xff1a;一个重载了 () 运算符的类的实例&#xff08;对象&#xff09;。它的核心特点是&#xff1a;看起来像函数&#xff08;能像函数一样调用&#…

基于Django的连锁火锅智慧餐饮管理系统 计算机毕业设计选题 计算机毕设项目 前后端分离【源码-文档报告-代码讲解】

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

计算机毕业设计springboot“木成林”学生互助平台的设计与实现 基于Spring Boot的“学林互助”学生服务平台设计与实现 Spring Boot框架下“林聚学”学生互助系统的设计与开发

计算机毕业设计springboot“木成林”学生互助平台的设计与实现15u46&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展&#xff0c;学生群体对于信息共享和…

让资产“活”起来!复杂美“万物上链•WEB3商城”亮相2025全球数字贸易博览会

2025年9月&#xff0c;杭州——在2025全球数字贸易博览会上&#xff0c;复杂美科技作为区块链技术企业代表之一&#xff0c;携其创新产品“万物上链•WEB3商城”亮相展会&#xff0c;吸引了众多参观者的目光。“万物上链WEB3商城”简介 “万物上链WEB3商城”前身为2018年诞…

《Light》突破性成果:2μm波段InP基量子点激光器性能超越传统量子阱结构

01前言在一间设备精良的分子束外延实验室里&#xff0c;研究团队小心翼翼地控制着每一个生长参数。当第五层量子点结构终于完成生长&#xff0c;经过精密测试&#xff0c;仪器屏幕上跳出了期待已久的数据&#xff1a;波长2.018微米&#xff0c;阈值电流密度589A/cm。 这是中红外…

创客匠人:智能体赋能老年康养 IP—— 从单兵服务到人机协同的适老化变现革命

引言&#xff1a;老龄化浪潮下&#xff0c;老年康养 IP 的 “服务困境” 如何破&#xff1f;当我国 60 岁以上人口突破 3 亿&#xff0c;老年康养赛道迎来爆发式增长&#xff0c;但多数创始人 IP 却陷入 “想服务好却力不从心” 的僵局&#xff1a;一人包揽健康监测、康复指导、…

我们不是卖产品,而是在交付一种人生的意义

在消费进入“精耕于人”的时代&#xff0c;产品的定义正在被重新改写。曾经&#xff0c;产品是为“解决功能需求”而存在&#xff1b; 现在&#xff0c;产品是为“表达我是谁”而生。当代消费者&#xff0c;尤其以 Z 世代为代表&#xff0c;他们购买的已不再是物品&#xff0c;…

互联网大厂Java面试实战:Spring Boot、微服务与AI技术全解析

互联网大厂Java面试实战&#xff1a;Spring Boot、微服务与AI技术全解析 在互联网大厂Java求职面试中&#xff0c;技术深度和业务场景的结合尤为重要。本文通过模拟一场严肃的面试官与搞笑水货程序员谢飞机的面试对话&#xff0c;涵盖了核心Java、Spring生态、微服务架构、数据…

学习 Python,用哪个编辑器比较好

学习 Python&#xff0c;用哪个编辑器比较好&#xff1f; 对于初学者来说&#xff0c;选择合适的编程环境是开启编程之旅的第一步。Python 作为一门功能强大且应用广泛的编程语言&#xff0c;拥有丰富的开发工具和编辑器供我们选择。但面对众多选项&#xff0c;究竟哪一款才是最…

创客匠人:智能体重构露营户外 IP—— 从风口赚快钱到长期变现的效率革命

引言&#xff1a;露营热潮退去&#xff0c;户外 IP 如何跳出 “昙花一现” 的怪圈&#xff1f;前两年露营赛道火遍全网&#xff0c;无数户外 IP 跟风入场&#xff0c;靠线路推荐、装备测评赚快钱&#xff1b;但当热潮退去&#xff0c;多数 IP 陷入 “流量暴跌、营收腰斩” 的困…

创客匠人:智能体赋能儿童美育 IP—— 从单兵教学到人机协同的创意变现革命

引言&#xff1a;儿童美育 IP 的 “创意困境”—— 想教好又想做好&#xff0c;为何两头为难&#xff1f;家长对儿童美育的需求早已超越 “教画画”&#xff0c;而是追求 “创意启蒙 个性培养 安全陪伴” 的综合体验&#xff0c;但多数创始人 IP 却陷入 “单兵作战” 的死循环…

创客匠人:智能体重构社区团购运营 IP—— 从单兵管理到人机协同的效率变现革命

引言&#xff1a;社区团购 IP 的 “运营困局”—— 团长难管、用户难留&#xff0c;为何越忙越不赚&#xff1f;社区团购赛道看似门槛低&#xff0c;但多数创始人 IP 却陷入 “单兵运营” 的恶性循环&#xff1a;一人要对接供应链、管理团长、维护用户、处理售后、统计订单 ——…

科技赋能洁净厂区 明诺E810FB助力江苏上骐集团绿色发展

作为深耕电气机械制造领域的标杆企业&#xff0c;江苏上骐集团始终秉持“绿色生产、精细管理”的发展理念&#xff0c;在推进高效新结构永磁电机生产线智能化技改的同时&#xff0c;更将厂区环境优化提升至战略高度。为破解传统清洁模式效率低下、扬尘污染等痛点&#xff0c;打…

从点击到对话:AI 时代的未来购物,人机交互方式的全面变革

一、从“搜索购物”到“对话购物”&#xff1a;零售的底层交互正在重写 过去二十年&#xff0c;购物的主入口从浏览器搜索框、转移到APP&#xff0c;再转向直播与短视频&#xff0c;但它们都以“人主动找商品”为核心逻辑。 而 2026 年开始&#xff0c;零售的底层交互第一次发…

国产算力首证具身大脑模型训练实力:摩尔线程联合智源研究院完成RoboBrain 2.5全流程训练

随着具身智能成为人工智能的下一个战略高地&#xff0c;底层算力底座的自主可控显得尤为关键。近日&#xff0c;摩尔线程联合北京智源人工智能研究院&#xff08;以下简称&#xff1a;智源&#xff09;基于FlagOS-Robo框架&#xff0c;依托MTT S5000千卡智算集群&#xff0c;成…