2026/4/16 20:22:40
网站建设
项目流程
如何用社交网站开发客户,国家信息公示系统入口官网,惠民建设局网站,智能手机网站开发原文
在某些情况下#xff0c;除了运行时库#xff08;C#xff09;中提供支持的一些基本类型#xff08;bool、short、int、float等#xff09;之外#xff0c;behaviac还支持扩展使用已有的或者用户自定义的类、结构体和枚举类型。
这里有两种情况#xff0c;其处理…原文在某些情况下除了运行时库C中提供支持的一些基本类型bool、short、int、float等之外behaviac还支持扩展使用已有的或者用户自定义的类、结构体和枚举类型。这里有两种情况其处理方式是不同的有些类型是程序中本来就有的该类型可能是某个第三方库中提供的但这些类型是不方便随意修改的。另外一些可以随便修改的类型请参考自定义类或结构体。字符串和数组类型需要注意的是behaviac组件为了支持C的反射系统对字符串和数组类型有如下要求字符串不要使用std::string需要使用behaviac::string因为behaviac::string使用了自定义的allocator可以对内存的使用进行统一的管理。数组不要使用std::vector需要使用behaviac::vector。char类型此外需要对char、signed char和unsigned char做出一些必要的说明在C中char、signed char和unsigned char是三个不同的类型。在编辑器中分别对应char、sbyte、ubyte。对于C#char、sbyte和byte是基本类型分别对应编辑器中的char、sbyte和ubyte。扩展使用已有的类型对于已有的不能修改源码的类型需要按照如下步骤进行扩展在.h文件中通过宏BEHAVIAC_EXTEND_EXISTING_TYPE特化某个需要的类型。如下代码样例所示假设TestNS::Float2是某个第三方库中的类型需要用到但不能修改它BEHAVIAC_EXTEND_EXISTING_TYPE(myFloat2,TestNS::Float2);定义一个“相似”的structmyFloat2该struct的作用是用来定义那个已存在的类的成员以便behaviac能够访问该类。通过DECLARE_BEHAVIAC_STRUCT的第二个参数isRefType为true或false表示该类型是否为引用类型如下代码所示。structmyFloat2{floatx;floaty;DECLARE_BEHAVIAC_STRUCT(myFloat2,false);myFloat2(){}myFloat2(constTestNS::Float2v):x(v.x),y(v.y){}};在命名空间StringUtils的嵌套子空间Private中实现该类型的ToString()和FromString()函数。注意myFloat2中需要实现相应的转换构造函数myFloat2(const TestNS::Float2 v)如下代码样例所示namespacebehaviac{// ValueToString ValueFromStringnamespaceStringUtils{namespacePrivate{templateinlinebehaviac::stringToString(constTestNS::Float2val){//myFloat2::ToString is defined by DECLARE_BEHAVIAC_STRUCT(myFloat2)myFloat2temp(val);returntemp.ToString();}templateinlineboolFromString(constchar*str,TestNS::Float2val){myFloat2 temp;//myFloat2::FromString is defined by DECLARE_BEHAVIAC_STRUCT(myFloat2)if(temp.FromString(str)){val.xtemp.x;val.ytemp.y;returntrue;}returnfalse;}}}}实现该类型的模板函数SwapByteTempl()注意该函数不能放在任何命名空间namespace中如下代码样例所示templatetypenameSWAPPERinlinevoidSwapByteTempl(TestNS::Float2v){SwapByteTemplSWAPPER(v.x);SwapByteTemplSWAPPER(v.y);}在命名空间behaviac的嵌套子空间Details中实现该类型的Equal()模板函数如下代码样例所示namespacebehaviac{namespaceDetails{templateinlineboolEqual(constTestNS::Float2lhs,constTestNS::Float2rhs){returnTag::IsEqualWithEpsilon(lhs.x,rhs.x)Tag::IsEqualWithEpsilon(lhs.y,rhs.y);}}}在初始化注册Register的部分需要加上如下的代码反注册UnRegister的部分添加相应UnRegister的代码。注意这部分Register/UnRegister的代码不是必须的如果该类型没有用作par或者没有用作条件比较就可以不需要。behaviac::TypeRegister::RegisterTestNS::Float2(TestNS::Float2);behaviac::TypeRegister::UnRegisterTestNS::Float2(TestNS::Float2);详细代码可以参考behaviac组件C源码库中btunittest工程的extendstruct.h文件。