news 2026/5/12 23:19:18

向阳花木(二)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/5/9 9:56:05

科技修仙(1)Excel入门训练学习算法——东方仙盟

核心代码核心算法// ************************** 修仙版题目配置&#xff08;含公式答案&#xff09; ************************** const xianQuestion {"title": "练气期第1关&#xff1a;学生总分悟道","rows": 6, // 作答行数"lingqiPe…

作者头像 李华
网站建设 2026/5/11 23:59:16

PasteMD剪贴板美化神器:5分钟搭建本地AI文本格式化工具

PasteMD剪贴板美化神器&#xff1a;5分钟搭建本地AI文本格式化工具 1. 为什么你需要一个本地AI文本格式化工具&#xff1f; 你有没有遇到过这种情况&#xff1f; 从网页上复制了一段会议纪要&#xff0c;格式乱七八糟&#xff0c;有奇怪的换行、多余的符号&#xff0c;想整理成…

作者头像 李华
网站建设 2026/5/10 13:45:07

Qwen3-ASR-1.7B与Dify平台集成:打造个性化语音识别应用

Qwen3-ASR-1.7B与Dify平台集成&#xff1a;打造个性化语音识别应用 最近在折腾一个智能客服的项目&#xff0c;需要把语音对话转成文字&#xff0c;市面上开源的语音识别模型试了一圈&#xff0c;效果总是不太理想。要么是识别不准&#xff0c;要么是部署太麻烦&#xff0c;要…

作者头像 李华
网站建设 2026/5/9 5:10:07

腾讯混元翻译大模型实战:Streamlit界面操作指南

腾讯混元翻译大模型实战&#xff1a;Streamlit界面操作指南 你是否经历过这样的场景&#xff1a;需要把一份中文技术文档快速翻成俄语发给海外同事&#xff0c;却发现在线翻译工具要么卡在“正在加载”&#xff0c;要么译文满是语法错误&#xff1b;又或者正为跨境电商商品页做…

作者头像 李华
网站建设 2026/5/10 20:35:39

Llava-v1.6-7b性能优化:利用GPU加速多模态推理

Llava-v1.6-7b性能优化&#xff1a;利用GPU加速多模态推理 1. 为什么需要GPU加速Llava-v1.6-7b Llava-v1.6-7b作为一款功能强大的多模态模型&#xff0c;能够同时理解图像和文本&#xff0c;在视觉问答、图像描述、内容分析等场景中表现出色。但它的70亿参数规模和复杂的视觉…

作者头像 李华
网站建设 2026/5/12 0:31:08

Qwen3-TTS语音合成惊艳效果展示:听AI说10种语言

Qwen3-TTS语音合成惊艳效果展示&#xff1a;听AI说10种语言 1. 引言&#xff1a;当AI开口说世界 想象一下&#xff0c;你正在制作一个面向全球用户的短视频&#xff0c;需要为同一个脚本配上中文、英文、日文、西班牙文等十几种语言的旁白。传统方案是什么&#xff1f;要么聘…

作者头像 李华