news 2026/5/20 13:23:23

向阳花木(二)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/19 20:51:46

基于Spring Boot的躲猫猫书店管理系统

目录 摘要 演示视频 系统功能实现 代码实现 推荐项目 项目案例 项目开发总结 为什么选择我 源码获取 博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于…

作者头像 李华
网站建设 2026/5/20 13:23:58

基于Spring Boot的校园闲置物品交易系统

&#x1f345; 作者主页&#xff1a;Selina .a &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作。 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据…

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

如何成为AI提示系统的提示工程架构师:掌握用户反馈机制是关键

从提示词写手到架构师:用用户反馈机制构建高适配AI提示系统 副标题:成为AI提示工程架构师的核心方法论 摘要/引言 你可能有过这样的经历: 为电商客服写了一条“完美”的提示词,一开始用户反馈很好,但两周后用户开始抱怨“回答总是漏退换货规则”; 给企业知识库设计的提…

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

Kubernetes电商微服务项目部署实战指南

一、项目概述与架构1.1 项目背景本文以"商城"&#xff08;Wolf Mall&#xff09;电商项目为例&#xff0c;演示如何将传统的微服务架构完整迁移到Kubernetes平台。该项目采用典型的微服务架构&#xff0c;包含商品服务、订单服务、会员服务、购物车服务、网关服务等多…

作者头像 李华
网站建设 2026/5/20 19:33:47

无需训练!用RexUniNLU快速构建智能客服问答系统

无需训练&#xff01;用RexUniNLU快速构建智能客服问答系统 如果你正在为智能客服系统发愁&#xff0c;觉得训练模型太麻烦、标注数据太费时&#xff0c;那么今天介绍的RexUniNLU可能会让你眼前一亮。这是一个来自阿里巴巴达摩院的神奇工具&#xff0c;它能让你不用准备任何训…

作者头像 李华