我使用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存根,然后该存根处理参数和返回值。

10-08 11:58