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
の下にあり、そのインスタンスではなくクラスに定義しています)のバインディングを定義しようとしましたが、いずれのアプローチでも成功しませんでした。
C++やLuaのどちらの側でも、 '__call'演算子を使って「偽」する方法はありませんか? – Xtapolapocetl
@Xtapolapocetl:LuabindはC++型をユーザーデータとして格納しているため、Luaコードはそのメタテーブルに影響を与えません。あなたはC++からLuabindのメタテーブルを突き抜けることができましたが、実際これは無視できる程度の小さな問題です。実際に構文が本当にあなたを煩わせるならば、Luabindでオブジェクト 'FooInternal'を呼び出し、' FooInternal.create'関数を呼び出す関数 'Foo'を作成するだけです。ユーザーは、彼らが 'Foo'というクラスを使っていると考えることができます。 –
@Xtapolapocetl:Nicolのコメントに加えて、 'Foo'を使ってオブジェクトを作成すれば(つまり他のスコープメソッドはありません)、' Foo = Foo.create'だけでもできます。 – sbk