广州建网站公司网站建设中模板 模板无忧
2026/2/11 15:01:31 网站建设 项目流程
广州建网站公司,网站建设中模板 模板无忧,推荐佛山伦教网站设计,wordpress ajax 慢一、说明 在前面学习和分析了元编程的逻辑操作。如果在C17以前没有提供这几个逻辑模板操作应该怎么做呢#xff1f;虽然已经有了轮子#xff0c;但是不是可以逆向一下这个轮子#xff0c;自己尝试着再造一个类似的轮子#xff0c;会不会能够更好的理解其内在的实现原理和机…一、说明在前面学习和分析了元编程的逻辑操作。如果在C17以前没有提供这几个逻辑模板操作应该怎么做呢虽然已经有了轮子但是不是可以逆向一下这个轮子自己尝试着再造一个类似的轮子会不会能够更好的理解其内在的实现原理和机制呢二、定义和实现在这里仅以std::conjunction为例来进行逻辑模板的实现先看一下在cppreference上的实现templateclass...structconjunction:std::true_type{};templateclass B1structconjunctionB1:B1{};templateclass B1,class...BnstructconjunctionB1,Bn...:std::conditional_tbool(B1::value),conjunctionBn...,B1{};再看一下库中的实现templatetypename...struct__and_;templatestruct__and_:public true_type{};templatetypename _B1struct__and__B1:public _B1{};templatetypename _B1,typename _B2struct__and__B1,_B2:public __conditional_t_B1::value,_B2,_B1{};templatetypename _B1,typename _B2,typename _B3,typename..._Bnstruct__and__B1,_B2,_B3,_Bn...:public __conditional_t_B1::value,__and__B2,_B3,_Bn...,_B1{};templatetypename..._Bnstructconjunction:__and__Bn...{};两者的实现基本类似都是先实现特化版本用来终止变参模板的条件不明白可以看一下前面变参模板相关的文章然后conditional_t来递归的处理逻辑类型值的结果。三、实现源码及分析下面看看用别的方法是否也可以实现类似的代码逻辑操作。看下面的代码#includeiostream#includetype_traits// 普通模板空参数返回true_typetemplatetypename...struct__and__:std::true_type{};// 递归特化并检查条件templatetypename T,typename...Reststruct__and__T,Rest...:std::integral_constantbool,T::value__and__Rest...::value{};// 模拟AND实现templatetypename...Condusing __and_t____and__Cond...;// 多and检测templatetypename T,typenamevoidstructcheck_mul_attr:std::false_type{};templatetypename Tstructcheck_mul_attrT,std::void_tdecltype(std::declvalT().test()),decltype(std::declvalT().display()),typename T::nestType:__and_t__std::is_samedecltype(std::declvalT().test()),void,std::is_samedecltype(std::declvalT().display()),int,std::is_convertibletypename T::nestType,int{};// 测试结构体structAllAttr{//static void test(){}voidtest(){}intdisplay(){return0;}using nestTypeint;};structPartialAttr{voidtest(){}using nestTypeint;};structNothing{};intmain(){// 测试AND逻辑std::coutall have: check_mul_attrAllAttr::valuestd::endl;// 1std::coutpartial: check_mul_attrPartialAttr::valuestd::endl;// 0std::coutnothing: check_mul_attrNothing::valuestd::endl;// 0// 测试__and_t__std::couttest and result True: __and_t__std::true_type,std::true_type::valuestd::endl;// 1std::couttest and result False: __and_t__std::true_type,std::false_type::valuestd::endl;// 0return0;}编译展开后的代码为#includeiostream#includetype_traitstemplatetypename...type_parameter_0_0struct__and__:public std::integral_constantbool,true{};/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::is_sameint,int,std::is_convertibleint,int:public std::integral_constantbool,true{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::is_convertibleint,int:public std::integral_constantbool,true{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__:public std::integral_constantbool,true{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::integral_constantbool,true:public std::integral_constantbool,true{};#endif/* First instantiated from: insights.cpp:8 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::integral_constantbool,false:public std::integral_constantbool,false{};#endif/* First instantiated from: insights.cpp:18 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::is_samevoid,void,std::is_sameint,int,std::is_convertibleint,int:public std::integral_constantbool,true{};#endif/* First instantiated from: insights.cpp:43 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::integral_constantbool,true,std::integral_constantbool,true:public std::integral_constantbool,true{};#endif/* First instantiated from: insights.cpp:44 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestruct__and__std::integral_constantbool,true,std::integral_constantbool,false:public std::integral_constantbool,false{};#endiftemplatetypename T,typename...Reststruct__and__T,Rest...:public std::integral_constantbool,T::value__and__Rest...::value{};templatetypename...Condusing __and_t____and__Cond...;templatetypename T,typename type_parameter_0_1voidstructcheck_mul_attr:public std::integral_constantbool,false{};/* First instantiated from: insights.cpp:38 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestructcheck_mul_attrAllAttr,void:public __and__std::is_samevoid,void,std::is_sameint,int,std::is_convertibleint,int{};#endif/* First instantiated from: insights.cpp:39 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestructcheck_mul_attrPartialAttr,void:public std::integral_constantbool,false{};#endif/* First instantiated from: insights.cpp:40 */#ifdefINSIGHTS_USE_TEMPLATEtemplatestructcheck_mul_attrNothing,void:public std::integral_constantbool,false{};#endiftemplatetypename Tstructcheck_mul_attrT,std::void_tdecltype(std::declvalT().test()),decltype(std::declvalT().display()),typename T::nestType:public __and_t__std::is_samedecltype(std::declvalT().test()),void,std::is_samedecltype(std::declvalT().display()),int,std::is_convertibletypename T::nestType,int{};structAllAttr{inlinevoidtest(){}inlineintdisplay(){return0;}using nestTypeint;};structPartialAttr{inlinevoidtest(){}using nestTypeint;};structNothing{};intmain(){std::operator(std::cout,all have: ).operator(std::integral_constantbool,true::value).operator(std::endl);std::operator(std::cout,partial: ).operator(std::integral_constantbool,false::value).operator(std::endl);std::operator(std::cout,nothing: ).operator(std::integral_constantbool,false::value).operator(std::endl);std::operator(std::cout,test and result True: ).operator(std::integral_constantbool,true::value).operator(std::endl);std::operator(std::cout,test and result False: ).operator(std::integral_constantbool,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控制。四、总结重复造轮子好不好没有一个标准的答案但如果造轮子是出于学习的目的如果这个轮子规模不太大的情况下一定是个好事。学习最忌的是“知其然不知其所以然”因为这种情况下往往无法灵活主动的有机结合各种技术解决问题。大多数情况下往往是高级的“生搬硬套”这就会带来各种各样的问题。关键是这些问题不一定会在当下暴露出来然而当其真正暴露出来时就可能是一个大问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询