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

扩展使用已有的类型-–-behaviac

原文

在某些情况下,除了运行时库(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);
  • 定义一个“相似”的struct(myFloat2),该struct的作用是用来定义那个已存在的类的成员,以便behaviac能够访问该类。
  • 通过DECLARE_BEHAVIAC_STRUCT的第二个参数isRefType为true或false表示该类型是否为引用类型,如下代码所示。
structmyFloat2{floatx;floaty;DECLARE_BEHAVIAC_STRUCT(myFloat2,false);myFloat2(){}myFloat2(constTestNS::Float2&v):x(v.x),y(v.y){}};
  • 在命名空间StringUtils的嵌套子空间Private中实现该类型的ToString()和FromString()函数。注意myFloat2中需要实现相应的转换构造函数(myFloat2(const TestNS::Float2& v)),如下代码样例所示:
namespacebehaviac{// ValueToString & ValueFromStringnamespaceStringUtils{namespacePrivate{template<>inlinebehaviac::stringToString(constTestNS::Float2&val){//myFloat2::ToString is defined by DECLARE_BEHAVIAC_STRUCT(myFloat2)myFloat2temp(val);returntemp.ToString();}template<>inlineboolFromString(constchar*str,TestNS::Float2&val){myFloat2 temp;//myFloat2::FromString is defined by DECLARE_BEHAVIAC_STRUCT(myFloat2)if(temp.FromString(str)){val.x=temp.x;val.y=temp.y;returntrue;}returnfalse;}}}}
  • 实现该类型的模板函数SwapByteTempl(),注意该函数不能放在任何命名空间(namespace)中,如下代码样例所示:
template<typenameSWAPPER>inlinevoidSwapByteTempl(TestNS::Float2&v){SwapByteTempl<SWAPPER>(v.x);SwapByteTempl<SWAPPER>(v.y);}
  • 在命名空间behaviac的嵌套子空间Details中实现该类型的Equal()模板函数,如下代码样例所示:
namespacebehaviac{namespaceDetails{template<>inlineboolEqual(constTestNS::Float2&lhs,constTestNS::Float2&rhs){returnTag::IsEqualWithEpsilon(lhs.x,rhs.x)&&Tag::IsEqualWithEpsilon(lhs.y,rhs.y);}}}
  • 在初始化注册(Register)的部分需要加上如下的代码,反注册(UnRegister)的部分添加相应UnRegister的代码。注意:这部分Register/UnRegister的代码不是必须的,如果该类型没有用作par或者没有用作条件比较,就可以不需要。
behaviac::TypeRegister::Register<TestNS::Float2>("TestNS::Float2");behaviac::TypeRegister::UnRegister<TestNS::Float2>("TestNS::Float2");

详细代码可以参考behaviac组件C++源码库中btunittest工程的extendstruct.h文件。

http://www.cnnetsun.cn/news/96124.html

相关文章:

  • Java面试Redis核心知识点整理!
  • 9、数据足迹缩减:存储容量优化策略
  • 17、IT 领域的技术解析与服务洞察
  • 卡顿监测原理
  • [创业之路-733]:CTO - 技术视野、商业理解力、领导力、团队间协作与沟通、团队管理:“技术的战略家 + 商业的合伙人 + 团队的教练”
  • 手把手教你用大模型构建知识图谱:从零开始到实际应用的完整指南,小白也能秒变AI大神!
  • 揭秘Dify Agent版本混乱难题:3步实现精准版本管控
  • 2025年低成本学AI:几款高性价比认证盘点(200元起)
  • Avalon-MM address和DRAM address地址映射
  • Java计算机毕设之基于javaweb的宠物托管系统宠物上门托管服务管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设选题推荐:基于JavaWeb的家装一体化平台基于SpringBoot+Vue的家装一体化平台【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于JavaEE的电子印章申请下发管理系统的电子办公签章系统基于JavaEE的电子印章管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【课程设计/毕业设计】基于Spring Boot框架的汽车配件销售管理系统基于JavaWeb的汽配销售管理系统【附源码、数据库、万字文档】
  • 【视频字幕检索核心技术】:Dify模糊匹配实战指南(99%的人都忽略的关键细节)
  • 深度剖析Dify PDF解密失败根源(附完整错误代码对照表)
  • 月薪3千到1万5,一名零售业上班族的逆袭:靠一本证书在“AI+”浪潮中突围
  • 只需5个步骤带你了解渗透测试全过程,SSH端口22如何完全沦陷!
  • 一个漏洞2w+,网安副业挖SRC漏洞,躺着把钱挣了!挖漏洞平均一天收入多少?
  • 数据血缘追踪与质量监控实现方法
  • 【编程干货】大模型开发文档处理秘籍,让你的RAG系统性能提升10倍!
  • 【AI开发必备】Mini Agent:零门槛构建智能Agent,支持MCP工具和无限长任务,GitHub已爆![特殊字符]
  • 栈与队列学习笔记
  • Oracle回滚与撤销技术
  • 我的mybatis-flex自定义查询为什么没有参数
  • 揭秘Dify混合检索缓存机制:为何缓存清理如此重要?
  • 计划赶不上变化?错!是计划“根本赶不上开工”
  • 应用冷启动优化
  • java_base_(接口篇)省流版
  • 实测主流科技查新网站:它们如何解决专利与项目查新的双重需求?
  • 【收藏必备】零基础入门AI Agent:概念、结构、方法与开发框架全解析