用于创建对象的C ++模板方法

时间:2012-08-17 15:43:21

标签: c++ templates lua luabind

我正在使用Luabind将我的游戏引擎暴露给Lua。 我最近遇到了麻烦,当我发现我无法创建一个“新的”,例如GUabject * obj = Lua中的新GUIObject(),而Lua中创建的所有内容都归Lua所有。

那不是一个大问题我决定在对象上创建一种工厂模式,例如我的GUIManager有

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

我的Luabind Bindings看起来像这样:

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。

如果需要,请随时提出更多信息

由于

1 个答案:

答案 0 :(得分:3)

由于您的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(); }
};