有没有办法获取表示
boost::hana
我可以传递并存储在地图/数据库中的结构反射?
我正在创建一个环境和共享库之间的接口,这些库作为插件动态加载。我需要反映库中使用的一些数据结构,以便用户可以在运行时使用环境导航这些结构。
在一个示例中,我可以很容易地反映出以下结构:
struct Car {
BOOST_HANA_DEFINE_STRUCT(Car,
(std::string, brand),
(std::string, model)
);
};
我的库将创建
Car
并且需要通过入口点提供。这意味着它需要坚持从my environment SDK中实现一个基类,它看起来有点像这样:
template<class SharedStructureType>
class LibraryAPI
{
public:
virtual void run() = 0; // Some entrypoint called by the environment
ReflectedType GetReflection()
{
return to_reflection(m_sharedData);
}
protected:
SharedStructureType m_sharedData;
private:
ReflectedType to_reflection(SharedStructureType);
};
我的问题是我不知道如何实现
LibraryAPI::to_reflection
.
当使用boost::hana反射结构时,我希望看到创建的一些对象或成员代表反射规则,这就是我希望通过接口传递的内容。然而,调试器并没有显示这样的内容。
我怀疑这一切都是在编译时解析的巨型模板中解决的。但是,我的环境和库不会同时编译,因此这会使事情更加复杂。
有没有办法获得表示boost::hana结构反射的对象,我可以将其传递并存储在地图/数据库中?
---------------编辑-----------
我真正关心的不是取消引用数据,而是知道库使用的每个成员的名称、偏移量和大小。这将允许我使用环境根据配置在库之间映射数据,而无需在库之间共享头文件。我可能会在反射中添加类型,作为在实际执行之前验证memcpy的一种方法。
不幸的是,在这种情况下,
bmw.brand
和
boost::hana::second(pair)
在调试器中运行此操作时,请不要占用相同的内存。
Car bmw{"BMW", "Z3"};
boost::hana::for_each(bmw, [&](auto pair) {
if(&bmw.brand == &boost::hana::second(pair)
// We never get here
int i;
});