如何解决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 举报,一经查实,本站将立刻删除。