У меня есть класс, который я использую в своем коде на C++ и в некоторых сценариях Lua. Соответствующая часть класса выглядит следующим образом:C++ & Lua Api, размещение на месте с заводской функцией
typedef boost::shared_ptr<Thing> ThingPtr; // convenient
class Thing
{
public:
Thing() { /* do some stuff */ }
~virtual Thing() { }
ThingPtr createThing()
{
ThingPtr thing(new Thing);
// initialization can't be done in constructor
thing->doSomeInit();
return thing;
}
// other stuff....
};
Я разоблачить этот класс в Lua (без привязки или что-нибудь «фантазии»). Прежде чем я добавил функцию фабрики, моя функция Lua, чтобы создать Thing выглядел как:
int MyLua::newThing(lua_State* L)
{
int size = sizeof(Thing);
// allocate a new Thing object in place
new ((Thing*)lua_newuserdata(L, size)) Thing();
luaL_setmetatable(L, "MyStuff.thing");
return 1;
}
После того, как я добавил функцию заводскую я что-то вроде:
int MyLua::newThing(lua_State* L)
{
int size = sizeof(Thing);
// allocate a new Thing object in place
Thing* thing = new ((Thing*)lua_newuserdata(L, size)) Thing();
thing->doSomeInit();
luaL_setmetatable(L, "MyStuff.thing");
return 1;
}
Это прекрасно, казалось хорошо, за исключением что теперь я хочу, чтобы конструктор Thing был закрыт для обеспечения использования фабричной функции в других местах кода C++. Итак, теперь у меня есть что-то вроде:
int MyLua::newThing(lua_State* L)
{
int size = sizeof(Thing);
ThingPtr thing = Thing::createThing();
void* space = lua_newuserdata(L, size);
memcpy(space, client.get(), size);
luaL_setmetatable(L, "MyStuff.thing");
return 1;
}
Мой вопрос: есть ли лучший способ сделать это? Призыв к memcpy заставляет меня чувствовать себя некомфортно.
Несвязанное и педантичное примечание: вы не должны передавать статическую функцию-член как 'lua_CFunction', потому что статическая функция-член никогда не имеет связи на языке Си. Большинство компиляторов не диагностируют это, но стандарт говорит, что это запрещено. – Simple
не используют ничего интересного, просто используйте привязку, например [LuaBridge] (https://github.com/vinniefalco/LuaBridge), руководство которой объясняет все трудности управления жизненным циклом объекта и предлагает решения. –