c++程序遵循用户定义脚本的最佳方式
Best way for a c++ program to follow a user-defined script?
我有一个模拟程序,它以特定的顺序多次重复一组函数,然后输出基于这些函数的一些计算结果。每个函数都会以某种方式对Simulator对象进行变异,并采用不同类型的可变数量的参数。例如:
class Simulator
{
Simulator();
void A(int x, double y, string z);
void B(int x, int y);
void C(double x);
};
我希望用户能够指定调用这些函数的顺序以及参数,并且我需要能够将这些信息存储在某种脚本中,以便程序遵循。例如,一个脚本最终可能被转换为程序的以下操作:
Simulator mySim;
mySim.A(5, 6.0, "a string");
mySim.B(1, 1);
mySim.A(3, 4.0, "another string");
mySim.C(10.0);
有有效的方法吗?我最初的想法是有一个对象的链接列表,每个对象都存储函数的名称和参数。然后,程序将遍历列表,依次调用每个函数。然而,这带来了几个问题:
(a) 如何在列表中存储参数,每个函数的参数都不同(数量和类型都不同)。
(b) 这似乎效率很低,因为我的程序在每次运行模拟时都必须执行一系列if语句,以确定要调用哪些函数。
有人有什么建议吗?
如果您想在一天内快速开始支持用户定义的脚本,请查看Lua。它可以说是最容易嵌入到C/C++程序中的语言之一。有了luabind,它就更容易了:
module(L)
[
class<Simulator>("Simulator")
.def("A", &Simulator::A)
.def("B", &Simulator::B)
.def("C", &Simulator::C)
];
完成!现在,我可以运行lua脚本,这些脚本可以创建Simulator并在其上调用函数,并获得完整lua语言及其基本库的所有功能,每次调用都计算数学表达式,创建用户定义的函数、闭包、lambdas等。在脚本语言方面,lua是一个速度恶魔。
事实上,我在一天内就成功地将一个相当大规模的商业C++程序变成了一个完全可以用Lua编写脚本的程序。它很容易嵌入,因为这就是它的设计初衷
还有Python,如果我们使用Boost.Python,它与luabind非常相似。虽然使用C API会更痛苦,而且开始时会更乏味(我们不能只构建一个静态链接的库就走,而且我们必须处理很多环境变量,如sys.path,并确保我们在调试/发布版本中使用正确的Python实现)。
您也可以在其他语言中进行选择,但据我所知,这两种最流行的语言提供了C++库,使绑定更加容易。
您也可以使用SWIG并开箱即用地支持多种脚本语言,但SWIG需要相当长的时间来学习,因为它有大量的文档,其中有很多细节需要注意,因为它适用于许多不同的语言。
如果您想在C++应用程序中添加脚本语言,可以嵌入LUA:http://www.lua.org/home.html
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 如何通过cpp程序运行shell脚本
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在程序中编写脚本来编写和编译代码
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 如何在c++中使用system()来运行包含空格的python脚本
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 在cygwin中运行c++脚本时发生错误
- PHP 脚本与应用程序通信的最佳方法
- c++程序遵循用户定义脚本的最佳方式
- 将Python脚本作为可执行文件的最佳方式
- 在我的解释器上为脚本代码实现语法检查器的最佳方式是什么