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

C++那些事之结构化绑定

C++那些事之结构化绑定

在聊结构化绑定之前,有几个面试问题,看看你会不会?

  • 如何使用结构化绑定访问自定义类的私有成员?

  • 如何使用结构化绑定修改自定义类的成员呢?

这几个题目估计没几个人能答上来,题目与答案网上也都没有,基于这些问题,我们引出本文的内容:如何为自定义类型支持结构化绑定,里面有哪些坑?

注:懒人版,答案与代码已放星球。

为了让本文的内容更加丝滑,从示例出发。

1.自定义类型

如果给定一个类:

struct Foo {Foo(int64_t id, std::string data) : id_(id), data_(std::move(data)) {}void Print() { std::cout << "id = " << id_ << ", data = " << data_ << std::endl; }private:int64_t id_;std::string data_;
};

要让下面这个代码运行起来:

int main() {Foo f{12, "hello world"};const auto& [id, data] = f;std::cout << "id = " << id << ", data = " << data << std::endl;f.Print();
}

如果直接运行会编译:

cannot decompose inaccessible member 'Foo::id_' of 'const Foo'42 |   const auto& [id, data] = f;

那么怎么做呢?

2.支持结构化绑定

这个问题我们使用两个步骤:

1.特化 std::tuple_sizestd::tuple_element

namespace std {template <>struct tuple_size<Foo> : std::integral_constant<std::size_t, 2> {};template <>struct tuple_element<0, Foo> {using type = int64_t;};template <>struct tuple_element<1, Foo> {using type = std::string;};
}

2.为上面的结构体添加友元get函数,然后实现即可:

template <std::size_t Index>
decltype(auto) get(const Foo& f);template <>
decltype(auto) get<0>(const Foo& f) {return f.id_;
}template <>
decltype(auto) get<1>(const Foo& f) {return f.data_;
}

此时便可以正常的工作了,得到输出:

id = 12, data = hello world
id = 12, data = hello world

最后,抛出几个问题:

  • 上面提供的是只读访问,如果在访问的时候修改const auto &会发生什么?

例如:

auto& [id, data] = f;
  • 如何支持对类成员的修改访问?

即,让这个语句能够正常运行

auto& [id, data] = f;

好了,本节完,欢迎留言区交流。

揭秘答案,戳下方呀~

b19e823f519d9e2e214a5e882ebe3ddc.jpeg

往期推荐:

向量数据库milvus源码剖析之开篇

热度更新,手把手实现工业级线程池

玩转cpp小项目星球3周年了!

57d2ef3609413b1caeffc528841ba663.jpeg

http://www.lryc.cn/news/411690.html

相关文章:

  • ECRS工时分析软件:工业工程精益生产的智慧引擎
  • 大语言模型的核心岗位及其要求
  • 【屏驱MCU】RT-Thread 文件系统接口解析
  • 进程管理工具top ps
  • 2年社招冲击字节,一天三面斩获offer
  • oppo,埃科光电25届秋招,快手25届技术人才专项计划等几千家企业岗位内推
  • 【Vulnhub系列】Vulnhub Lampiao-1 靶场渗透(原创)
  • MySQL:ORDER BY 排序查询
  • UML类图 详解
  • 【IEEE出版 | 高录用率 | 快速检索 | 有ISBN号!】2024年智能计算与数据挖掘国际学术会议 (ICDM 2024,9月20-22)
  • DaoCloud配置不同环境的流水线(Q)
  • 基础的Shell命令
  • 量子仿真speedUp的经验
  • 电测量数据交换DLMS∕COSEM组件第61部分:对象标识系统(OBIS)(下)
  • 【Java】重生之String类再爱我一次---练习题(012)
  • NSSCTF-GDOUCTF 2023新生赛
  • 论文解析——Character Region Awareness for Text Detection,字符级文本检测CRAFT算法
  • 基于飞腾平台的Kafka移植与安装
  • 【Python数据结构与算法】递归----算24
  • TOSHIBA东芝代理商--芯智雲城,提供订货、报价、选型等服务!
  • sdwan
  • Linux: network: 建立socket以及设置nonblock/opt所需的时间
  • git使用及代码规范
  • 职业教育大数据实验实训室建设应用案例
  • 【Academy】反序列化漏洞Insecure deserialization
  • 【轨物推荐】康波、世界体系与创新范式:中国如何引爆新一轮产业革命
  • [HCTF 2018]admin1
  • 【Qwen-Audio部署实战】Qwen-Audio-Chat模型之对话机器人部署测试
  • 第一百八十五节 Java XML教程 - Java DOM简介
  • 一款功能强大且免费的图片查看和管理工具