news 2026/4/8 1:03:48

向阳花木(二)C++ ATTR 宏自动属性生成器——封装配置项

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
向阳花木(二)C++ ATTR 宏自动属性生成器——封装配置项

C++ 宏封装配置项(多属性接口)

  • 1. 背景
  • 2. ATTR 宏的定义
    • 2.1 `ATTR.h`
    • 2.2 ATTR 实际生成的代码
    • 2.3 最小示例
  • 3. ATTR 使用示例
    • 3.1 ATTR 的基本使用规则
    • 3.2 读取属性(Getter)
    • 3.3 属性赋值(Setter)
    • 3.4 常见错误总结

1. 背景

在实际项目中,我们经常需要维护大量配置项,例如:

  • 串口地址
  • 网络地址
  • 标定参数
  • 传感器参数等

如果每个配置项都手写成员变量 + Getter + Setter,会产生大量重复代码,可维护性较差。因此,项目中引入了一个ATTR 宏,用来自动生成“属性接口”,简化开发工作。本文结合实际项目代码,总结 ATTR 的设计原理、读写方式及正确使用方法。

2. ATTR 宏的定义

ATTR生成的是“函数属性”,不是变量

  • 读:name()
  • 写:name(value)

ATTR优点

  • 大幅减少样板代码
  • 风格统一
  • 使用简单
  • 支持移动语义

ATTR缺点

  • 依赖宏,不易调试
  • IDE 跳转不友好
  • 扩展逻辑困难
  • 报错信息不直观
    适合内部工具类、配置类使用。

三个关键点

  1. 所有访问必须走函数
  2. 赋值只能在函数中完成
  3. 默认值 → ini 覆盖 → 运行使用 → 保存回写

2.1ATTR.h

#ifndefATTR_H#defineATTR_H/* * 使用前提: * - ATTR 必须写在 class 的 private: 区域 * - 成员变量属于 private * - Getter / Setter 自动提升为 public */#defineATTR(Type,Name,Default)\Type _##Name=Default;\\public:\/* Getter */\constType&Name()constnoexcept{return_##Name;}\\/* Setter(lvalue) */\voidName(constType&value)noexcept{_##Name=value;}\\/* Setter(rvalue) */\voidName(Type&&value)noexcept{_##Name=std::move(value);}\private:#endif// ATTR_H

2.2 ATTR 实际生成的代码

例如:

ATTR(std::string,sensorSeialPort,"COM3");

等价于:

private:std::string _sensorSeialPort="COM3";public:// Getterconststd::string&sensorSeialPort()const{return_sensorSeialPort;}// Setter(拷贝)voidsensorSeialPort(conststd::string&v){_sensorSeialPort=v;}// Setter(移动)voidsensorSeialPort(std::string&&v){_sensorSeialPort=std::move(v);}private:

可以看到:

  • 生成了一个私有成员变量 _sensorSeialPort
  • 生成了一个 Getter
  • 生成了两个 Setter

ATTR 本质上就是一个“自动属性生成器”。

2.3 最小示例

classTest{private:ATTR(int,age,10)};intmain(){Test t;// 读std::cout<<t.age()<<std::endl;// 10// 写t.age(20);std::cout<<t.age()<<std::endl;// 20}

3. ATTR 使用示例

定义一个ConfigIni.hpp

classConfigIni{private:ATTR(int,age,10);ATTR(double,upperAxisLimit,100.f);ATTR(double,downAxisLimit,100.f);ATTR(std::string,sensorSeialPort,"COM3");// 默认初始化voidReadData(){sensorSeialPort(ini.GetValue("Sensor","SeialPort","COM1"));}voidSaveData(){ini.SetValue("Sensor","SeialPort",sensorSeialPort().c_str());}};

3.1 ATTR 的基本使用规则

  1. 必须写在 private 区域
    ATTR结尾自带 private:,因此必须放在类的 private 区域中。
    正确示例:

    classConfig{private:ATTR(int,age,10)};
  2. ATTR不是变量,是函数接口。使用 ATTR 后:

    • 不能直接访问成员变量
    • 必须通过函数访问
      这是理解 ATTR 的关键。

3.2 读取属性(Getter)

基本语法

name();

示例:

std::string addr=sensorSeialPort();doublelimit=upperAxisLimit();

3.3 属性赋值(Setter)

基本语法

name(value);

像调用函数一样赋值。

  1. 字面量赋值

    sensorSeialPort("COM5");
  2. 变量赋值

    std::string s="COM8";sensorSeialPort(s);

3.4 常见错误总结

  1. 当普通变量使用
    ❌ 错误:powerAddress = "COM3";
    ✅ 正确:powerAddress("COM3");
  2. 忘记加括号
    ❌ 错误:powerAddress;
    ✅ 正确:powerAddress();
  3. 试图通过返回值修改
    ❌ 错误:powerAddress() = "COM3";
    Getter 返回 const,禁止修改。
  4. 在类体中直接赋值
    ❌ 错误:powerAddress("COM1"); // 写在 class 里
    只能写在函数(构造函数 / 成员函数)中。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 17:41:23

数字化浪潮下,人工智能系统构建的全流程解析

在当下数字化如潮涌般的形势里&#xff0c;有这么一个情况&#xff0c;那就是众多企业和组织都将注意力聚焦在了人工智能系统的构建这件事情上。人工智能搭建是什么呢&#xff0c;简单来讲&#xff0c;它是一种情况&#xff0c;就是要从无到有或者依据现有的一些组件&#xff0…

作者头像 李华
网站建设 2026/3/19 19:35:03

比低薪更可怕的,是你的“技术无用化”

“我明明996加班&#xff0c;代码也没少写&#xff0c;为什么感觉越来越不值钱&#xff1f;”这不仅是焦虑&#xff0c;更是一种正在发生的残酷事实。我们常以为&#xff0c;只要在大厂镀金、只要熬够了工龄、只要手里的技术栈更新够快&#xff0c;薪资自然就会涨。但现实却是&…

作者头像 李华
网站建设 2026/3/29 11:57:18

AI绘画创业法律风险:必须了解的10个合规要点

AI绘画创业法律风险&#xff1a;必须了解的10个合规要点 关键词&#xff1a;AI绘画创业、法律风险、知识产权、数据合规、肖像权、著作权 摘要&#xff1a;随着AI绘画技术的迅猛发展&#xff0c;越来越多创业者投身于这一领域。然而&#xff0c;AI绘画创业之路并非一帆风顺&a…

作者头像 李华
网站建设 2026/4/5 14:09:49

7个强效步骤:用KeePassXC构建密码管理安全防护

7个强效步骤&#xff1a;用KeePassXC构建密码管理安全防护 【免费下载链接】keepassxc-browser KeePassXC Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ke/keepassxc-browser 密码安全至关重要&#xff0c;KeePassXC浏览器扩展通过自动填充与数据加密&…

作者头像 李华
网站建设 2026/3/25 16:08:57

幻境·流金多场景落地:时尚杂志大片、珠宝产品摄影、汽车广告图

幻境流金多场景落地&#xff1a;时尚杂志大片、珠宝产品摄影、汽车广告图 1. 影像创作新纪元 在视觉内容爆炸式增长的时代&#xff0c;专业级影像创作正面临前所未有的效率挑战。传统拍摄流程需要耗费大量时间在场地搭建、灯光调试和后期处理上&#xff0c;而「幻境流金」的出…

作者头像 李华