一种更通用的编译期反射

本文讨论了magic_get编译期反射的局限性,如仅支持pod类型且不提供字段名。提出了一种更通用的方法,支持所有类型的对象,包括获取字段、字段名和遍历对象。虽然需要定义宏,但提供了更完整、通用的元数据。编译期反射在ORM和序列化等场景中表现出强大的潜力,简化了数据库操作并提高了开发效率。
摘要由CSDN通过智能技术生成

magic_get编译期反射的局限性

magic_get可以实现编译期获取pod类型,是以一种“无痕”的方式实现的,即无需宏、特殊标记、专门工具。看起来确实很精妙,不过也存在一些局限性,比如只能支持pod类型,不能获取反射类型的字段名,也不支持遍历访问对象字段。这些局限性导致magic_get无法在更广泛的环境下应用。

一种更通用的编译期反射方法

基本的反射功能应该包括根据索引获取字段,根据索引获取字段名,遍历对象的所有字段,支持所有类型的对象。
一种更通用的编译期反射应该支持下面这些。

struct city_t
{
    int id;
    double num;
};
REFLECTION(city_t, id,num);

struct person_t
{
    int id;
    double num;
    city_t city;
};
REFLECTION(person_t, id,num,city);

int main()
{
    city_t city = {20, 3.5};
    person_t p = {1,2.5,city};

    //get filed name by index
    constexpr auto filed_name = get_name<person_t, 1>(); 

    //get value by index
    auto val = get<1>(p);

    //apply algorithm to every member of struct
    for_each(p, [](auto& v, size_t I)
    {
        v*=10;
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值