1

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);
};

バインディング コード:

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

これらの卓上プリンターをいくつか試してみましたが、うまくいきませんでした。

4

2 に答える 2

1

の作者ですlualite。私はライブラリを最小限かつ高速になるように作成しましたが、リフレクションの必要性を予見していませんでした:)とにかく、探しているものは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_;

thechar const*はプロパティの名前で、値は でmap_member_info_typeあり、基本的に 2 つのポインターであり、1 つはlualiteスタブへ、もう 1 つは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、メンバー関数に対して作成されたスタブに呼び出しを転送し、引数と戻り値を処理します。

于 2013-11-04T08:17:17.163 に答える