Luabind中的自定义构造函数

时间:2011-11-13 22:28:47

标签: lua coroutine luabind

我正在使用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下定义绑定,以在类上定义它,而不是它的实例),但我没有成功方法

1 个答案:

答案 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