使用C++模板方法来创建对象。

我正在使用Luabind将我的游戏引擎暴露给Lua。最近我遇到了问题,发现在Lua中没有办法创建一个"新"的对象,比如GUIObject * obj = new GUIObject(),而Lua中创建的所有对象都被Lua拥有。

那也不是什么大问题,我决定只是为对象创建一种工厂模式,例如我的GUIManager具有

class GUIManager {
template <class T> T * CreateObject( T classType )
{
    return new T();
}
}

我的Luabind绑定看起来像这样:

class_<GUIManager>("GUIManager")
         .def("CreateObject", (GUILabel*(GUIManager::*)(GUILabel classType))&GUIManager::CreateObject<GUILabel>)
         .def("CreateObject", (GUIImage*(GUIManager::*)(GUIImage classType))&GUIManager::CreateObject<GUIImage>)

通过调用以下内容,Lua中的一切都可以正常工作:

testLabel = theGUI:CreateObject(GUILabel())

然而,我觉得这不是“正确的”方式,因为我本质上是创建一个对象进行传递,我相信还有更简单的方法,但是到目前为止我尝试过的所有其他方法都不符合编译器或Luabind。

如果需要更多信息,请随时询问

谢谢

点赞
用户315052
用户315052

由于 Luabind 绑定使用了 CreateObject 方法的显式实例化,因此可以将每个实例绑定到不同的名称:

class_<GUIManager>("GUIManager")
         .def("CreateLabel", /*...*/&GUIManager::CreateObject<GUILabel>)
         .def("CreateImage", /*...*/&GUIManager::CreateObject<GUIImage>)

然后,Lua 代码可以“简化”为:

testLabel = theGUI:CreateLabel()

您的工厂方法中不再需要参数。

class GUIManager {
    template <class T> T * CreateObject() { return new T(); }
};
2012-08-17 16:41:26