我使用lualite将以下对象包装在lua中:
class SpriteComponent : public Component
{
public:
SpriteComponent();
std::string name() const;
std::string textureId() const;
void setTextureId(const std::string& id);
int spriteCoordX() const;
void setSpriteCoordX(int value);
int spriteCoordY() const;
void setSpriteCoordY(int value);
};
绑定(bind)代码:
module(L,
class_<SpriteComponent>("SpriteComponent")
.constructor("new")
.def("name", &SpriteComponent::name)
.property("textureId",
&SpriteComponent::textureId, &SpriteComponent::setTextureId)
.property("spriteCoordX",
&SpriteComponent::spriteCoordX, &SpriteComponent::setSpriteCoordX)
.property("spriteCoordY",
&SpriteComponent::spriteCoordY, &SpriteComponent::setSpriteCoordY)
);
有没有办法(在lua端或C++端)获取属性列表?如果在结果表中列出对,则只会得到
name
和__instance
。local o = SpriteComponent.new()
for key,value in pairs(o) do
print("found member " .. key);
end
我什至尝试了一些these表打印机,但是没有运气。
最佳答案
我是lualite
的作者。我编写的库极简且快速,并且没有预见到需要反射Reflection :)无论如何,您正在寻找的内容可以找到2个静态成员:
static ::std::unordered_map<char const*, detail::map_member_info_type,
detail::unordered_hash, detail::unordered_eq> getters_;
static ::std::unordered_map<char const*, detail::map_member_info_type,
detail::unordered_hash, detail::unordered_eq> setters_;
char const*
是属性的名称,值是map_member_info_type
,本质上是两个指针,一个指向lualite
存根,另一个指向C++
成员函数。struct map_member_info_type
{
lua_CFunction callback;
member_func_type func;
};
如果愿意,我可以将这两个成员公开。属性的工作方式如下:
通常在包装的类的实例表中设置默认的getter:
lua_pushcclosure(L, default_getter<C>, 2);
rawsetfield(L, -2, "__index");
这指向默认的getter:
template <class C>
int default_getter(lua_State* const L)
{
assert(2 == lua_gettop(L));
auto const i(lualite::class_<C>::getters_.find(lua_tostring(L, 2)));
return lualite::class_<C>::getters_.end() == i
? 0
: (lua_pushlightuserdata(L, &i->second.func),
lua_replace(L, lua_upvalueindex(2)),
(i->second.callback)(L));
}
查找属性的名称(在堆栈中)。那可能确实是什么,如果找不到名称,则返回0,否则,将调用转发给为成员函数创建的
lualite
存根,然后该存根处理参数和返回值。