POD静态反射弱

问题描述

我正在尝试实现以下目标:给定POD结构,我想在该结构上自动生成编译时元数据(即,我不想手动注册每个字段)。

我需要的元数据只是字段数和每个字段的字节大小。

例如,该结构:

struct MyData
{
    float field1;
    int field2;
}

我们需要的是FIELD_NUM(MyData)返回2,FIELD_SIZE(MyData,0)返回4。

我目前的做法很糟糕。我什至没有使用内置的预处理器,我有一个python解析器,用于在结构顶部搜索注释,并构建所有已注册结构的字典,然后将其模式代码替换为其数值。但这是非常有限的,例如,我什至不处理模板,因为那时候我最好自己制作C ++编译器。

使用模板元编程

好的,所以在评论中有人建议我观看一个非常有趣的视频。这表明要获取POD中的字段数,您可以执行以下操作:

template <std::size_t I>
struct ubiq_constructor
{
    template <class Type>
    constexpr operator Type&() const noexcept;
};

template <class T,std::size_t I0,std::size_t... I>
constexpr auto detect_fields_count(std::size_t& out,std::index_sequence<I0,I...>)
    -> decltype( T{ ubiq_constructor<I0>{},ubiq_constructor<I>{}... } )
{ out = sizeof...(I) + 1; }

template <class T,std::size_t... I>
constexpr void detect_fields_count(std::size_t& out,std::index_sequence<I...>) {
    detect_fields_count<T>(out,std::make_index_sequence<sizeof...(I) - 1>{});
}

其要点是,尝试使用等于该结构大小的多个参数初始化该结构,如果失败,则将参数减少一,继续进行直到参数数量与该结构中的字段匹配为止。 / p>

但是,当我尝试这样称呼它时:

struct POD {
    int f1;
    float f2;
    char h;
};


    std::size_t size;
    detect_fields_count<POD>(size,std::make_index_sequence<sizeof(POD)>());
    cout << "size:" << size << endl;

在预初始化时出现分段错误。你怎么称呼那些功能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)