跟我学c++高级篇——reflexpr

本文围绕C++反射技术规范展开,介绍了从C++14逐渐清晰的反射TS规范,强调其非标准性及可能的变化。阐述了反射的操作数、内容和库支持等规范内容,还给出例程说明。最后指出学习该知识应理清技术脉络以提升效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、反射的TS规范

Technical specifications,技术规范。反射的技术规范从c++14才逐渐清晰起来(Experimental Feature The functionality described on this page is part of the Reflection Technical Specification ISO/IEC TS 23619 (reflection TS).)。这里事先需要说明的是,这些只是规范,不是标准,所以包括在前面提到的c++26中的反射一样,都非常可能不断的变化。之所以变化还是要说明一下,主要是为了让大家有一个反射发展的历程。
在目前的规范中,使用reflexpr关键字做为反射的操作关键字。它定义在<experimental/reflect>,需要引用命名空间 std::experimental::reflect或者定义内联空间std::experimental::reflect::v1。

二、反射的规范

1、反射的操作数
reflexpr的反射的操作数可以是类型、命名空间、枚举、变量、数据成员、函数的形参、被捕获实体、 函数(包括普通函数、Lambada表达式、仿函数或相关函数式类型转过来的表达式。比如可以使用reflexpr(:😃 反射全局命名空间。
反射的关系是自反和传递的,但是非对称的(这个需要一些离散数学的知识)。
2、反射的内容
反射的内容,即reflexpr的对象必须是元数据类型,如果后面的反射对象为仿函数,那么此类中含有自定义的转换函数,则会发生错误。这个也比较好理解,其实就是定义了类似于别名的函数。比如常见的"using func = void(int)(char)"之类。

3、反射的库支持
反射的库支持主要有元对象和原生的支持,前者开发者可能都比较用得多,比如类似于一些常见的is系列“is_noexcept,is_scoped_enum”等等。而原生的概念支持则包括前面提到的“Object,Named,Typed”等等。此处不再赘述。

更多的规范,大家可以自行查阅相关的规范文档。

三、例程

因为这只是一个规范,所以就直接用规范中的例程来说明:

#include <string>
#include <vector>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值