在Lua脚本中创建一个新的C++对象?

---背景---

我想创建一个叫做“fileProcessor”的类。 这个类是完全静态的,仅用作方便的命名空间(在我的正常库命名空间中)以进行一些全局函数。 这是只包含相关内容的类的基本蓝图

class fileProcessor{
private:
    lua_State* LUA_state;
public:
    static std::variant<type1,type2> processFile(const char* filePath,const char* processorScript);
}

请再次注意,我省略了类中的大部分内容,因此如果有任何奇怪的地方,请忽略它。

processFile应该完成以下任务:

  1. 读取filePath文件,存储其中的所有指令(这是我的自定义文件类型或语法样式。这已经处理正确)。 指令存储为字符串,一个是命令,一个是命令之后的所有内容。
  2. 读取脚本文件并检查是否在顶部有一行被注释的fileProcessor行。这是为了确保加载的lua脚本是相关的,而不是一些随机的行为脚本
  3. 加载并编译lua脚本。
  4. 使所有读取的指令可用(它们保存在一个结构体中,有2个字符串,如上所述)
  5. 运行文件并接收一个对象。该对象只应是我列出的返回类型(variant)中的类型之一。

我在第4步和脚本的一个重要部分遇到了问题。

---问题---

如何使在lua中创建类型为type1或type2的完整新对象成为可能,在lua中编写它,并从lua堆栈中将其获取回C ++,并仍然知道它是type1还是type2?

---未提供示例,因为这个问题更为一般,我提供我的类的唯一原因是为了上下文。---

点赞
用户1981061
用户1981061

看起来你正在试图反过来做。我引用了这篇答案的一部分:

链接 ...你期望Lua作为主要语言,而C++作为客户端。问题是,Lua C 接口不是为这种工作方式设计的,Lua意味着是客户端,所有的繁重工作都应该在C中编写,以便Lua可以轻松调用它。

如果你确信没有其他办法,只能反过来做,你可以遵循这个答案的变通方法。否则,我认为你可以通过使用LUA来完成你所需的操作。

LUA有8种基本类型(_nil,boolean,number,string,userdata,function,thread,_和_table_)。但你可以通过在本机C++中创建一个新类型的类,并将其注册到LUA中,来添加新类型。

你可以通过以下方式注册:

  1. 使用一些LUA C++帮助程序,例如 luna.h (如此教程所示)。
  2. 推入一个带有C++类的新的lua表(请参阅此答案)。

类对象实例在本机C++代码中创建,并传递给LUA。LUA然后利用类接口提供的方法。

2017-10-10 13:54:59