C代码赏析获取结构体成员个数
C20consteval:立即函数,要求编译器求值requires:requires表达式,它是bool类型的纯右值表达式,描述对一些模板实参的约束。这种表达式在约束得到满足时是true,否则是false:T{Args。。。}:聚合初始化,从花括号初始化器列表初始化聚合体。operatorT():用户定义转换函数,允许从类类型到其他类型的隐式转换或显式转换。递归调用过程:CountMember()CountMember(AnyType)CountMember(AnyType,AnyType)CountMember(AnyType,AnyType,AnyType)sizeof。。。(Args)1相当于312includeiostreamincludevectorincludestdio。hstructPoint{doublex;doubley;};structAnyType{templatetypenameToperatorT();};templatetypenameTconstevalsizetCountMember(auto。。。Args){ifconstexpr(!requires{T{Args。。。};}){(1)returnsizeof。。。(Args)1;}else{returnCountMemberT(Args。。。,AnyType{});(2)}}intmain(intargc,charargv){structTest{inta;intb;intc;doubled;};printf(Test:zu,CountMemberTest());printf(Point:zu,CountMemberPoint());}
运行结果:Test:4Point:2
在线测试代码https:wandbox。orgC11includeiostreamincludevectorincludestdio。htemplateclass。。。usingvoidtvoid;structPoint{doublex;doubley;};structAnyType{templatetypenameToperatorT();};templatetypenameT,typenamevoid,typename。。。TsstructCountMember{constexprstaticsizetvaluesizeof。。。(Ts)1;};templatetypenameT,typename。。。TsstructCountMemberT,voidtdecltype(T{Ts{}。。。}),Ts。。。{constexprstaticsizetvalueCountMemberT,void,Ts。。。,AnyType::value;};intmain(intargc,charargv){structTest{inta;intb;intc;doubled;};printf(Test:zu,CountMemberTest::value);printf(Point:zu,CountMemberPoint::value);}