2011-11-13 19 views
1

Luabindを使用してC++ APIをLuaにバインドしています。私は直接作成することができないオブジェクトを持っていますが、別のスレッドで作成する必要があります。Luabindのカスタムコンストラクタ

luabind::class_<Foo>("Foo") 
    .scope 
    [ 
    luabind::def("create", &someCreateMethod, luabind::yield) 
    ] 

これは動作しますが、クライアントAPIを複雑にするという欠点を持っている:私は現在のオブジェクトが作成されるまで得createいわゆる「静的」メンバーを定義することによって、これを処理しています。これらのクラスでは、通常は作成できません(例:local f = Foo())。代わりにlocal f = Foo.create()を実行する必要があります。

実際にC++コンストラクタを呼び出さないLuabindコンストラクタを定義することは可能ですか?その代わりに、構築されたオブジェクトを返す(そしてその間に生成することができる)別の関数を定義できますか?私は__init__call(後者はscopeの下にあり、そのインスタンスではなくクラスに定義しています)のバインディングを定義しようとしましたが、いずれのアプローチでも成功しませんでした。

答えて

1

Luabindのコンストラクタは、実際のC++クラスのコンストラクタでなければなりません。だからちょっとしたAPIの奇妙さに対処しなければならないだろう。

あなたが興味を持っているのは、Fooをコンストラクタメソッドとして使用できることだけです。 LuaにFooLuaとしてC++クラスFooを登録してください。次に、FooLuaのメンバーではなく、Fooというルアフリー関数として登録してください。someCreateMethodを登録してください。したがって、ユーザに関する限り、Fooは、LuaクラスFooのコンストラクタです。

これでメンバーなどのその他の静的プロパティをFooに与えることができなくなります。しかし、いくつかの直接Lua APIコーディングを使用することでそれを達成できます。空のテーブルFooを作成して、を呼び出して__index__newindexを転送するメタテーブルを作成することができます。同様に、このメタテーブルの__callをオーバーライドして、構成をFoo.createに転送することもできます。

+0

C++やLuaのどちらの側でも、 '__call'演算子を使って「偽」する方法はありませんか? – Xtapolapocetl

+1

@Xtapolapocetl:LuabindはC++型をユーザーデータとして格納しているため、Luaコードはそのメタテーブルに影響を与えません。あなたはC++からLuabindのメタテーブルを突き抜けることができましたが、実際これは無視できる程度の小さな問題です。実際に構文が本当にあなたを煩わせるならば、Luabindでオブジェクト 'FooInternal'を呼び出し、' FooInternal.create'関数を呼び出す関数 'Foo'を作成するだけです。ユーザーは、彼らが 'Foo'というクラスを使っていると考えることができます。 –

+0

@Xtapolapocetl:Nicolのコメントに加えて、 'Foo'を使ってオブジェクトを作成すれば(つまり他のスコープメソッドはありません)、' Foo = Foo.create'だけでもできます。 – sbk

関連する問題