|
我自己实现了一个C++的reflection机制,然后自动转化成表传过去。在lua中, map, array, object是同一类东西,都可以用表来表示。
当然如果你的数据结构比较大,而每次同步的部分数据量又比较少,直接用metatable 将一个C++对象域映射到lua的元方法上就好了。
思路:
由于C++没有原生的反射机制,所以你得照样子去做一个。举个例子,你有个类A:
class A : public LuaObject {
public:
virtual void RetriveAllMethods(LuaState* L);
int value;
double another;
};
void A::RetriveAllMethods(luaState* L) {
RegisterMember(value); // 主动反射所有成员
RegisterMember(another);
}
其中RegisterMember可以这样实现:
#define RegisterMember(name) \
_Register(L, this, &name, #name);
然后:
template <class P>
struct Proxy {
void OnGet(lua_State* L, void* v) {
asset(false);
}
};
// 每个LUA支持的原生类型都写个
template <>
struct Proxy<double> {
void OnGet(lua_State* L, void* v) {
*v = lua_tonumber(L, -1);
}
}
// 最后
template <class T, class P>
void _Register(lua_State* L, T* object, P* member, const char* name) {
auto p = &Proxy<P>::OnGet;
auto q = &Proxy<P>::OnSet; // 如法炮制
// 把p, q指针保存下来,当有lua函数调用的时候调用它们
BindLuaMethod(L, name, object, p, q, (long)member - (long)object);
} |
|