C++ コードといくつかの Lua スクリプトで使用するクラスがあります。クラスの関連部分は次のようになります。
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 で公開します (バインディングや「派手な」ものは使用しません)。factory 関数を追加する前は、 Thingを作成する Lua 関数は次のようになりました。
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;
}
これは問題ないように見えましたが、C++ コードの他の場所でファクトリ関数の使用を強制するためにThingのコンストラクタをプライベートにしたいという点を除いては問題ありません。だから、今私は次のようなものを持っています:
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の呼び出しは不快に感じます。