3

私は、オブジェクトを作成し、Luaでそれらにビヘイビアーをアタッチする小さなC ++/Luaシステムを作成しようとしています。現在、私はLuaWrapper(基本的なC ++からLuaのものへの小さなヘッダー)を使用していますが、私の問題は、Luaが静的クラスメソッド(または非静的関数)を登録することしかできないということです。 Lua typedefは、パラメーターが1つしかないメソッドを想定してlua_State* Lおり、非静的メソッドには暗黙のが含まれているためthisです。

他のライブラリに依存せずにこれを解決する方法を望んでいました。必要なのはLuaの非静的クラス/プロパティだけなので、LuaBind+Boostやその他の依存度の高いラッパーを使用する理由はありません。

4

4 に答える 4

2

LuaWrapperは、クラス内の非静的関数に直接接続することを意図したものではありません。私はそれがいくつかの特別なトリックを伴う可能性があると思いますが、これは私がそれを使用するように設計した方法です:

static int Widget_AddChild(lua_State* L)
{
    Widget* parent = luaW_check<Widget>(L, 1);
    Widget* child = luaW_check<Widget>(L, 2);
    if (parent && child)
    {
        lua_pushboolean(L, parent->AddChild(child));
        return 1;
    }
    return 0;
}

// ...

static luaL_reg Widget_metatable[] =
{
    { "AddChild", Widget_Addchild },
    // ...
    { NULL, NULL }
};

私は通常、lua以外のものを別のファイルに保存します。この場合、Widget.cpp/hppです。次に、必要に応じて作成するこれらのようなバインディングを含むLuaWidgetファイルがあります。(これらの関数をすばやく簡単に作成できるようにするためのスニペットスニペットもいくつかあります。vimを使用している場合は、喜んで共有します)

于 2011-09-09T18:14:22.753 に答える
1

クラスのインスタンスと引数を受け入れる静的関数を作成し、そのインスタンスでその関数を呼び出すことができます。

void func_static(MyClass* inst, T arg) {
    inst->func(arg);
}

次に、関数を登録して、その関数をメタ関数として呼び出し、luaで実行できるようにします。

blah:x(y)

blahこれは、を含むユーザーデータと引数を受け取る関数を呼び出し、とyを呼び出します。func_staticblahy

于 2011-09-09T18:09:58.557 に答える
1

toLua ++(http://www.codenix.com/~tolua/)の使用を検討することをお勧めします。

クラス定義を解析し、c ++コードファイルを出力して、非静的クラスメンバーをLuaで使用できるようにすることができます。

于 2011-09-09T18:31:30.253 に答える
0

LuaCppWrapperもご覧ください。単純なバインディングのみを対象としています。本格的なソリューションが必要な場合は、おそらくOOLuaまたはSimpleLuaBinderが必要です。

于 2011-09-12T20:55:44.980 に答える