在 C++ 中使用的脚本语言中在运行时创建新的类/成员 [关闭]

2024-03-13

我已经断断续续地解决这个问题几个月了,现在想要真正想出一个正确的解决方案来处理使用成员函数创建新的用户定义类(以及这些类的实例)的情况/ C++11 项目中运行时的属性。

到目前为止,我一直在使用 SWIG(以前使用 Python,现在使用 Lua,探索 Squirrel)。与我迄今为止遇到的所有 C++ 绑定/嵌入库(Luna*、luabinder、luabind、OOLua、Sqrat/Sqext、Squall)一样,它们都希望您的类在代码执行之前在 C++ 中预定义,因为它们要么依赖于预处理器指令或模板。

所以我的问题是,是否有任何库使用更程序化的方法来包装语言,或者是否有任何好的教程/示例(例如 Lua 或 Squirrel),可以推荐用于处理自定义命名类的创建具有自定义成员和函数?一些方向将不胜感激。

即使只是一个很好的例子,展示如何在 Lua、Squirrel 中通过各自的 C++ API 创建具有函数和属性的自定义类,而不使用宏/模板/动态生成的代码,也会非常有帮助。

编辑:我已经创建了一个Instance包含一个类std::vector成员键/值对,以及标识类型的成员,以便可以查找函数。然而,关于在 Lua/Squirrel 中不使用静态代码创建简单类的文档非常少。

编辑2:我想要一个可以在任何平台上运行并且无需动态链接的解决方案。


创建从某些现有 C++ 类派生的类是将新类引入正在运行的 C++ 程序的唯一方法(据我所知)。如果没有动态编译实际的 C++ 源代码并加载生成的库,就无法物理添加新类。下一个最好的事情是在 C++ 中创建一个包装 Python(Lua 等)对象的代理对象,并使该 Python(Lua)对象成为一个类的实例,该类扩展镜像到 Python(Lua)端的现有 C++ 类。

        C++

     +---------+         mirrors                   +--------------+
     | class X |  ...............................> | class X      |
     +---------+                                   | mirrored to  |
          |                                        | Python       |
          | inherits                               +--------------+
          v                                      inherits  |
     +-----------------+                                   v
     | class X_Wrapper |        references         +--------------+
     |    | python obj ------------------------->  | class CX(X): |
     +-----------------+                           |    def met() |
                                                   +--------------+

下面是使用 Python 扩展 C++ 类的示例,使用 boost::python 作为桥梁。

C++方面:

#include <boost/python.hpp>
#include <iostream>

using namespace boost::python;
// this is the interface we will implement in Python
struct World
{
    virtual std::string greet() = 0;
    virtual ~World() {}
};

// this is a helper class needed to access Python-overrided methods
struct WorldWrap : World, wrapper<World>
{
    std::string greet()
    {
        return this->get_override("greet")();
    }
};

// This function tests our class implemented in Python
std::string test(World* w)
{
    std::cout << "Calling w->greet() on some World-derived object\n";
    return w->greet();
}

// This is what the Python side will see
BOOST_PYTHON_MODULE(hello)
{
    class_<WorldWrap, boost::noncopyable>("World")
            .def("greet", pure_virtual(&World::greet));

    def("test", test);
}

Python端:

import hello


class HomeWorld(hello.World):
    """ Implements a function defined in C++ as pure virtual """
    def greet(self):
        return "howdy"

home = HomeWorld()
print (hello.test(home))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中使用的脚本语言中在运行时创建新的类/成员 [关闭] 的相关文章

随机推荐

  • 当我更新我的 sqlite 核心数据存储时,如何避免出现“SQL 执行期间错误:约束失败”?

    我们的应用程序允许用户从 API 提供的列表中选择位置 该列表很少更新 并且仅通过添加项目来更新 因此应用程序不会每次都访问 API 而是在 Core Data sqlite 存储中提供快照 我们希望它定期更新列表 执行此操作的代码如下所示
  • gcc 不匹配标签选项给出“无法识别的命令行选项”

    我试图激活该选项 Wmismatched tags在 gcc 上 检测不一致的类 结构声明 这可能在使用前向声明时发生 但在 Ubuntu 上我得到 c error unrecognized command line option Wmis
  • “替换”功能示例

    我没有找到该项目的帮助页面replace函数从base包很helpful 最糟糕的是 它没有可以帮助理解其工作原理的示例 您能解释一下如何使用它吗 举一两个例子就太好了 如果您查看该函数 通过在控制台中输入其名称 您会发现它只是一个简单的函
  • 我想仅为特定资源运行 terraform

    运行 terraform 并等待需要很长时间 所以我想运行它来排除执行时间最长的rds 或者我只想运行 ec2 资源 有没有办法在地形中做这样的事情 您可以使用 target resource https www terraform io
  • 为什么 DirectFB 没有在 GNU/Linux 中得到更广泛的应用?是否存在 X11 中不存在的严重限制?

    据我了解 DirectFB为多种显卡提供硬件加速 此外 它比 X11 更小 更快 并且占用的内存更少 那么 为什么它没有比现在更主流呢 我真正不确定的是 常见的 GTK Qt 程序是否需要移植到它 在 DirectFB 网站上 有一个将 F
  • 带有 JDBC 准备语句的字符串中的圆括号

    这是我的 Java JDBC 代码 例如修改和简化的 ps connection prepareStatement SELECT a b c FROM mytable WHERE category ps setString 1 my sup
  • C语言数据类型算术规则

    在 C 编程中 如果我在下面的等式中使用变量 k X Y n 其中 exp 是数学常数 e 提升到 pi 3 14159 j sqrt 1 并且这些变量都被声明为 64b 双精度浮点数 其中 X 是复数 输出的结果也将是这种数据类型 out
  • Angular 2 悬停事件

    在新的Angular2框架 有谁知道像事件一样进行悬停的正确方法吗 In Angular1有ng Mouseover 但这似乎并没有被延续下来 我浏览了文档但没有发现任何内容 如果你想在任何 HTML 元素上执行类似悬停的事件 那么你可以这
  • C# 查找解决方案中的所有测试

    我是否可以使用任何技术来查找解决方案中注释为测试的所有测试 TestMethod Fact Theory 语境 我对这一切都很陌生 但正在尝试制定持续部署策略 我想在发布过程期间 之后找到并运行解决方案中的所有测试 这些不是依赖于构建的单元
  • 有多少 WebGL 内存可用?当我用完时会发生什么?

    GPU 内存是有限的 通常比 JS 堆大小等更有限 诸如大量高分辨率图像之类的东西可能会填满内存 而且它是共享资源 因此其他应用程序可能会使用大量内存 在 OpenGL 中 我可以查询可用内存 WebGL 有没有办法做同样的事情 我怎样才能
  • 在回收器视图上创建上下文菜单时,menuInfo 为 null

    我试图在回收器视图中单击项目时显示上下文菜单 并选择呼叫姓名被单击的人 但我无法检索电话号码 因为 getMenuInfo 不起作用 因为我在 onCreateContextMenu 的 contextMenuInfo 中得到 null 我
  • 在 C++ 中打印星号“三角形”

    我想制作一个打印此类输出的通用代码 这意味着用户可以输入任何值 整体 for 5 and for 3 这是我做的 但它打印出直角三角形 任何帮助 提前致谢 include
  • 如何避免在我的应用程序启动时中断已在播放的音频?

    我有一个应用程序需要使用AVAudioSessionCategoryPlayback为了在设备锁定或我的应用程序在后台时播放声音 这是一个闹钟功能 所以我还需要在 UIBackgroundModes 列表中设置 音频 键 我已将以下代码放入
  • 将事件处理程序附加到代码生成的数据模板

    我有一个相关问题this one https stackoverflow com questions 59451 creating a silverlight datatemplate in code 我正在尝试将事件附加到我的 Stack
  • Playframework 和 Twitter 流 API

    如何从 Twitter Streaming API POST 状态 过滤器读取响应数据 我已建立连接并收到 200 状态代码 但我不知道如何阅读推文 我只想在推文出现时将其打印出来 ws url url sign OAuthCalculat
  • 僵尸进程的父进程终止后会发生什么?

    我只是好奇 如果僵尸进程的父进程不关心等待它 会发生什么 假设 我们有一个父母和一个孩子 子进程先于父进程终止 来自APUE 内核为每个终止进程保留少量信息 最少该信息包括进程 ID 进程的终止状态 家长需要使用以下方式获取此信息waitp
  • 拥有方的主键作为连接列

    NOTE 主题很长但很详细 如果您使用 Doctrine2 和 oneToOne 关系 可能会派上用场 最近在Doctrine中遇到一个问题 我创建了具有 oneToOne 双向关系的 User 和 UserData 对象 User one
  • 将 Promise 包装在 async/await 中

    我在 async await 和从 Promise 返回值方面遇到了一些困难 function test return new Promise resolve reject gt resolve Hello async function c
  • 浏览器对蓝牙信标/iBeacons 的感知

    有没有办法让浏览器知道其附近的 iBeacon 设备 类似于 HTML5 地理定位的工作方式 如果不是 这是否可以通过浏览器插件来实现 该插件可以提供 javascript 使用的详细信息 很不幸的是 不行 没有 Web 浏览器在信标检测和
  • 在 C++ 中使用的脚本语言中在运行时创建新的类/成员 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我已经断断续续地解决这个问题几个月了 现在想要真正想出一个正确的解决方案来处理使用成员函数创建新的用户定