繁体   English   中英

使用lua的C ++ Factory

[英]C++ Factory using lua

我有一个脚本,其中:

  • 自定义语言仅用于数据
  • 使用C ++中的Script类加载
  • 我有诸如Type等标签
  • 获取标签值的接口-Script :: GetValue(Tag,T&value)

该脚本的用法如下:

Script* script("someFile");
script->GetValue("Type", type);
Object* obj = CreateObject(type);
obj->Load(script);

其中从对象加载函数用于加载其余obj参数。 现在,我将脚本语言更改为lua。 我的问题是:

我应该保持这种创建对象的方式(仅将lua用于数据)还是应该在lua中公开工厂并从lua中使用它,就像这样(在lua中):

CreateObject("someType")
SetProperty(someObj, someProperty, someValue)

首先,我想知道哪种更快,第一种或第二种方法。 您还有其他建议吗? 因为我正在重构这部分,所以我愿意接受其他建议。 我想保留lua,因为它速度快,易于集成且体积小。

您可以根据需要允许脚本环境创建或不创建C ++对象。 tolua ++使用所有的metatable功能来允许在lua中非常直接地操作您的c ++类型。

例如,此声明:


// tolua_begin
class SomeCppClass
{
public:
   SomeCppClass();
   ~SomeCppClass();

   int some_field;
   void some_method();
};
// tolua_end

将自动生成lua绑定以允许此lua scipt:


#!lua
-- obj1 must be deleted manually
local obj1 = SomeCppClass:new() 
-- obj1 will be automatically garbage collected 
local obj2 = SomeCppClass:new_local()

obj1.some_field = 3 -- direct access to "some_field"
obj2:some_method() -- direct call to "some_method"

obj1:delete()

这种技术的优点是您的lua代码将与依赖的C ++代码非常一致。 参见http://www.codenix.com/~tolua/tolua++.html

在这种情况下,我更喜欢设置一个绑定的C函数,该函数将参数表作为参数。 因此,Lua脚本如下所示。

CreateObject{
    Type = "someType"'
    someProperty = someValue,
    -- ...
}

该表将在回调函数中位于堆栈的顶部,并且可以使用lua_getfield通过名称访问所有参数。

您可能还需要调查Lua环境的沙箱

第一种方法很可能会更快,但是第二种方法可能会导致较少的对象初始化代码(假设您要初始化很多对象)。 如果选择第一种方法,则可以手动进行。 如果选择第二种方法,则可能要使用Luabind之类的绑定库来避免错误并加快实现时间, 前提是要针对多种对象类型和数据类型进行此操作。

最简单的方法可能是仅使用Lua进行数据处理。 如果要公开工厂并通过Lua使用它,请确保首先值得付出努力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM