Пользовательский конструктор в Luabind - PullRequest
1 голос
/ 14 ноября 2011

Я использую Luabind для привязки API C ++ к Lua. У меня есть некоторые объекты, которые не могут быть созданы напрямую, а должны быть созданы в другом потоке. В настоящее время я обрабатываю это, определяя «статический» член с именем create, который возвращает до создания объекта:

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

Это работает, но имеет недостаток, заключающийся в усложнении клиентского API. Для этих классов вы не можете создать их нормально (например, local f = Foo()), но вместо этого нужно сделать local f = Foo.create().

Можно ли определить конструктор Luabind, который на самом деле не вызывает конструктор C ++, а вместо этого другую функцию, которая возвращает сконструированный объект (и может дать результат тем временем)? Я пытался определить привязки для __init и __call (последний под scope, чтобы определить его для класса, а не для его экземпляров), но у меня не было успеха ни с одним из подходов.

1 Ответ

1 голос
/ 14 ноября 2011

Конструкторы в Luabind должны быть реальными конструкторами класса C ++.Так что вам просто придется иметь дело с небольшой странностью API.

Если все, что вас интересует, это возможность использовать Foo в качестве метода конструктора, то вы можете сделать это.Зарегистрируйте свой класс C ++ Foo как FooLua в Lua.Затем зарегистрируйте это someCreateMethod, не как член FooLua, а как просто бесплатную функцию Lua, называемую Foo.Таким образом, что касается пользователя, Foo является конструктором для класса Lua Foo.

Теперь это будет препятствовать вашей способности давать Foo другие статические свойства, такие как члены и т.вперед.Но вы можете сделать это, используя прямое кодирование Lua API.Вы можете создать пустую таблицу Foo и создать для нее метатаблицу, которая перенаправляет вызовы __index и __newindex на FooLua.Точно так же вы можете переопределить метатаблицу __call, чтобы перевести конструкцию на Foo.create.

...