我正在使用Luabind将C ++ API绑定到Lua。我有一些无法直接创建的对象,而是必须在另一个线程上创建。我目前正在通过定义一个名为create
的“静态”成员来处理这个问题,该成员会在创建对象之前产生:
luabind::class_<Foo>("Foo")
.scope
[
luabind::def("create", &someCreateMethod, luabind::yield)
]
这有效,但缺点是使客户端API复杂化。对于这些类,您无法正常创建它们(例如local f = Foo()
),而是需要执行local f = Foo.create()
。
是否可以定义一个实际上不调用C ++构造函数的Luabind构造函数,而是另一个返回构造对象的函数(并且可以在此期间产生)?我已经尝试为__init
和__call
(后者在scope
下定义绑定,以在类上定义它,而不是它的实例),但我没有成功方法
答案 0 :(得分:1)
Luabind中的构造函数必须是实际的C ++类构造函数。所以你只需处理轻微的API怪异。
如果您感兴趣的是能够使用Foo
作为构造函数方法,那么您可以执行此操作。将您的C ++类Foo
注册为FooLua
到Lua。然后,注册此someCreateMethod
,而不是FooLua
的成员,而只是注册为Foo
的Lua免费函数。因此,就用户而言,Foo
是Lua类Foo
的构造函数。
现在,这将阻止您提供Foo
其他静态属性(如成员等)的能力。但是你可以通过使用一些直接的Lua API编码来实现这一点。您可以创建一个空表Foo
并为其创建一个元表,以便将__index
和__newindex
来电转发给FooLua
。同样,您可以覆盖此metatable的__call
以将构造转发到Foo.create
。