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

223 篇文章 92 订阅

一、反射的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>

struct S
{
    int b;
    std::string s;
    std::vector<std::string> v;
};

// 反射 TS
#include <experimental/reflect>
using meta_S = reflexpr(S);
using mem = std::reflect::get_data_members_t<meta_S>;
using meta = std::reflect::get_data_members_t<mem>;
static_assert(std::reflect::is_public_v<meta>); // 成功

int main() {}

再看下面的一个例子:

#include <iostream>
#include <string>
#include <string_view>
// 反射 TS
#include <experimental/reflect>

template <typename Tp>
constexpr std::string_view nameof()
{
    using TpInfo = reflexpr(Tp);
    using aliased_Info = std::experimental::reflect::get_aliased_t<TpInfo>;
    return std::experimental::reflect::get_name_v<aliased_Info>;
}

int main()
{
    std::cout << nameof<std::string>() << '\n';
    static_assert(nameof<std::string>() == "basic_string"); // 成功
}

需要说明的是,这里的编译需要自己处理一下编译的相关内容。不同的平台,不同的编译器可能均有所不同。不过,说实话,能不能编译对这类问题来说,并不重要,因为它只是一个对规范的实例说明。规范变了,它也就变了,而标准才是最终的定义。

四、总结

这一章的实践意义并不大,但实际意义其实是很大的。学习知识最容易的方式不是直接拿过来用,也不是从头一点点的扣出来。学习知识最快捷的方式是把当下的技术搞明白,同时把某些关键技术的来历再理清晰,脉络分明后,学习的效率就会迅速增加。
简单是技术普及的前提!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值