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

向阳花木(二)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 里
    只能写在函数(构造函数 / 成员函数)中。
http://www.jsqmd.com/news/360103/

相关文章:

  • Snapd和Apt—Linux 上两种完全不同的软件包管理系统
  • 什么是网络数字地图
  • 基于Spring Boot的电子政务服务管理系统
  • 基于Spring Boot的躲猫猫书店管理系统
  • 从草稿到佳作:DeepSeek辅助学术论文写作的全流程技术指南
  • 【论文阅读:TPAMI_2025 基于对抗特征提取和稳定图像重建的红外与可见光图像融合】
  • 人该怎样活着呢?版本68.8
  • 2026年管桁架厂家厂家权威推荐榜:四川钢网架加工、屋顶钢结构网架、管桁架加工、管桁架批发、管桁架生产公司选择指南 - 优质品牌商家
  • Lua与C语言接口编程实战指南:打造高性能、灵活的程序
  • 2026年钢结构球形网架厂家推荐:钢结构桁架价格/钢网架价格/四川管桁架厂家/四川钢网架加工/屋顶钢结构网架/选择指南 - 优质品牌商家
  • 2026年钢网架施工公司公司权威推荐:钢网架价格、四川管桁架厂家、屋顶钢结构网架、管桁架加工、管桁架批发选择指南 - 优质品牌商家
  • 2026年防静电陶瓷地板厂家推荐:防静电硫酸钙地板厂家、防静电陶瓷地板厂家、陶瓷防静电地板厂家选择指南 - 优质品牌商家
  • 2026年阆中消防维保公司厂家推荐:仪陇消防维保公司哪家靠谱/仪陇消防维保公司电话/南充消防检测公司/选择指南 - 优质品牌商家
  • 2026年全铝防静电地板厂家最新推荐:防静电硫酸钙地板厂家、防静电通风地板厂家、防静电陶瓷地板厂家选择指南 - 优质品牌商家
  • 2026年代理记账服务厂家推荐:资质升级代理代办、一站式资质代理代办、一般纳税人代理记账、专业资质代理代办选择指南 - 优质品牌商家
  • 2026年玻璃酒瓶厂家权威推荐榜:寿酒定制玻璃酒瓶、泸州定制玻璃厂家位置、泸州定制玻璃酒瓶、泸州玻璃酒瓶厂选择指南 - 优质品牌商家
  • 0-1背包问题(回溯法)
  • 2026年重庆白癜风医院厂家推荐:重庆白癜风医院推荐哪家、重庆白癜风医院收费标准、重庆白癜风医院电话选择指南 - 优质品牌商家
  • 2026年防静电地板厂家推荐:陶瓷防静电地板厂家、全钢防静电地板厂家、全铝防静电地板厂家、复合防静电地板厂家选择指南 - 优质品牌商家
  • 2026年复合防静电地板厂家最新推荐:复合防静电地板厂家、成都防静电地板厂家、防静电全钢地板厂家选择指南 - 优质品牌商家
  • 2026年防静电地板厂家公司权威推荐:防静电硫酸钙地板厂家/防静电陶瓷地板厂家/陶瓷防静电地板厂家/选择指南 - 优质品牌商家
  • 传统理赔周期冗长,富卫保险智能核保能否终结等待焦虑?
  • 新视野混合净值波动有几何?贝莱德基金回撤控制策略是否命中关键?
  • AI智能体:从感知到决策,如何自主完成多步骤任务
  • 2026年防静电通风地板厂家厂家最新推荐:全钢防静电地板厂家、全铝防静电地板厂家、复合防静电地板厂家选择指南 - 优质品牌商家
  • 数字化浪潮下,人工智能系统构建的全流程解析
  • 2026年评价高的陶瓷防静电地板公司推荐:陶瓷防静电地板厂家、全钢防静电地板厂家、全铝防静电地板厂家选择指南 - 优质品牌商家
  • 基于Spring Boot的校园家教信息平台
  • 安卓证书在线生成_免费一键制作apk打包 一键制作工具
  • 2026年成都防静电地板厂家推荐:防静电硫酸钙地板厂家、防静电通风地板厂家、防静电陶瓷地板厂家选择指南 - 优质品牌商家