【 在 DoorWay 的大作中提到: 】
:
https://eliasdaler.github.io/meta-stuff/: 照着这个写的,精简后就200行。看他github上的源码更直接。
: 我模仿了他的思路,tuple + index_sequence,前面的函数指针
: ...................
很简单,它这个Member类完全可以与对象类型无关:
template <typename T>
class Member : public IMember {
public:
Member(size_t offset) : offset(offset) {}
void fromJson(void* obj, const json& j) const override
{
*(T*)((char*)obj+offset) = j;
}
json toJson(const void* obj) const override
{
return json(*(const T*)((const char*)obj+offset));
}
private:
size_t offset;
};
考虑到offset是个常量,你把offset挪到模板参数里也行。
实际上T Class::*底下实际实现就是个offset,但它完全没必要地带了T和Class类型,导致你每个Class都对应一套Member,而它们实际实现是完全一样的,不知道编译器能不能优化掉。
注册这样写:member<typeof(Person::age)>("age", offsetof(Person, age))
当然可以写个宏把typeof和offsetof隐藏掉。
或者我这样问吧,明明对于每个Class,MetaHolder<Class>已经存了Class类型了,为什么里面每个Member还要再存一遍Class类型呢?有什么好处?
Member只需要name, type, offset,这些其实和特定Class无关的。
--
修改:ilovecpp FROM 58.37.58.*
FROM 58.37.58.*