news 2026/6/26 4:32:49

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
扩展使用已有的类型-–-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文件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 9:03:44

1、云、虚拟化与数据存储网络:从挑战到机遇的旅程

云、虚拟化与数据存储网络:从挑战到机遇的旅程 在当今数字化的时代,信息技术(IT)领域正经历着前所未有的变革。数据的爆炸式增长、新技术的不断涌现,都给企业的信息服务带来了新的挑战和机遇。本文将深入探讨云、虚拟化和数据存储网络相关的重要话题,帮助您更好地理解如…

作者头像 李华
网站建设 2026/6/25 23:25:51

8、数据足迹缩减:实现经济高效的数据需求增长

数据足迹缩减:实现经济高效的数据需求增长 在当今数字化时代,数据量呈爆炸式增长,企业和组织面临着数据存储、管理和保护的巨大挑战。数据足迹缩减(Data Footprint Reduction,DFR)作为应对这一挑战的关键策略,正日益受到关注。本文将深入探讨数据足迹缩减的相关内容,包…

作者头像 李华
网站建设 2026/6/24 23:38:21

10、数据存储服务与系统全解析

数据存储服务与系统全解析 1. 数据存储概述 数据存储技术用于在内部或外部、本地或远程(包括云与托管服务提供商)基础上存储和访问数据、应用程序和虚拟机。存储的位置多样,如SAN、NAS、云系统、服务器、工作站、笔记本电脑和其他便携式设备等。不同类型的存储具有不同的特…

作者头像 李华
网站建设 2026/6/26 2:25:09

14、云、虚拟和数据存储网络的管理工具解析

云、虚拟和数据存储网络的管理工具解析 1. 引言 在当今的 IT 领域,云、虚拟和数据存储网络的管理至关重要。正如 Greg Schulz 所说:“如果你只有一把锤子,那么所有东西看起来都像钉子。”这强调了工具选择和使用的重要性。本文将深入探讨云、虚拟和数据存储网络的管理工具…

作者头像 李华
网站建设 2026/6/24 11:30:37

16、数据存储网络的效率与效能提升之路

数据存储网络的效率与效能提升之路 1. 回顾与思考 在探讨数据存储网络相关话题时,我们不应局限于是否需要云、虚拟化、融合或数据存储网络环境这些问题。对于非供应商、顾问、分析师、记者或负责组织 IT 相关解决方案的人来说,购买和部署新解决方案通常是为了解决业务问题。…

作者头像 李华
网站建设 2026/6/26 1:07:39

互联网大厂Java后端面试中常见面试题及其答案

java中的四种引用有哪些 java中的四种引用有&#xff1a;强引用、软引用、弱引用和虚引用。不同的引用类型&#xff0c;主要体现的是对象不同的可达性&#xff08;reachable&#xff09;状态和对垃圾收集的影响。 强引用&#xff08;"Strong" Reference&#xff09…

作者头像 李华