4

tolua++ を使用して、C++ クラスの Lua バインディングを生成します。

C++ クラスがあるとします。

class Foo
{
    //Some methods in Foo, irrelevant to question.
};

および次の内容の tolua .pkg ファイル

class Foo
{
};

次の関数を検討してください。

void call_some_lua_function(lua_State* luaState)
{
    Foo* myFoo = new Foo();
    tolua_pushusertype(luaState, (void*)myFoo, "Foo"); 

    //More code to actually call Lua, irrelevant to question.   
}

さて、実際の質問:

tolua_pushusertype は、3 番目のパラメーターが tolua_cclass の呼び出しで登録された C++ クラスの有効な完全修飾文字列に対応しない場合、Lua で segfault を引き起こします。したがって、パラメータ 3 が「Bar」の場合、segfault が発生します。

私がやりたいことは次のとおりです。

void call_some_lua_function(lua_State* luaState)
{

    //determine if tolua is aware of my type, how to do this?
    //Something like:
    //if(!tolua_iscpptype_registered("Foo"))
    //{
    //   abort gracefully
    //}

    Foo* myFoo = new Foo();
    tolua_pushusertype(luaState, (void*)myFoo, "Foo"); 

    //More code to actually call Lua, irrelevant to question.   
}

toluaを使ってこれを行う方法はありますか?

4

2 に答える 2

1

私はtolua++ではなくtoluaを使用していますが、それがどういうわけか似ていることを願っています。toluaでは、次のようにクラスが登録されているかどうかをテストできます。

tolua_getmetatable(L, "ClassName");
if (lua_isnil(L, -1)) {
   // the class wasn't found
}

ヒント: tolua.castがどのように実装されているかを確認し、その引数を確認してください。タイプ名を文字列として受け取ります。

編集:もっと不思議なことに、私はtolua ++ソースをダウンロードして、中を調べました。完全に似ているわけではなく、重要な機能がありません。私はあなたにうまくいくかもしれないテストされていない提案をしなければなりません:

luaL_getmetatable(L, "ClassName");
if (lua_isnil(L, -1)) {
   // the class wasn't found
}

toluaとtolua++の違いは、toluaが作成されたメタテーブルに「名前空間」(「tolua。」プレフィックス)を使用していることです。

于 2010-04-19T00:07:30.680 に答える
0

私はちょうど lua の初心者なので、私の提案: tolua 呼び出しを独自の関数にラップして、それを介して登録されたクラスを追跡します。これで、tolua がクラスを認識しているかどうかをラッパーに問い合わせることができます。

于 2010-04-16T16:56:22.433 に答える