我有一个模拟程序,它按特定顺序重复一组函数很多次,然后根据这些函数输出一些计算结果。每个函数都会以某种方式改变模拟器对象,并将采用不同类型的可变数量的参数。例如:
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语句,以确定要调用哪些函数,因此效率似乎相当低。
有人有任何建议吗?
答案 0 :(得分:6)
我的建议:不要发明自己的脚本语言/解释器。
如果您希望在一天内快速开始支持用户定义的脚本,请查看Lua。它可以说是嵌入C / C ++程序最简单的语言之一。使用luabind,它更容易:
module(L)
[
class<Simulator>("Simulator")
.def("A", &Simulator::A)
.def("B", &Simulator::B)
.def("C", &Simulator::C)
];
完成!现在我可以运行lua脚本,可以在其上创建模拟器和调用函数,并获得完整的lua语言及其基本库的所有功能,通过每次调用计算数学表达式,创建用户定义的函数,闭包,lambdas等。在脚本语言方面,lua是速度恶魔。
我实际上设法将一个相当大规模的商业C ++程序变成一个完全可编写脚本的程序,在一天内就可以使用Lua。它很容易嵌入,因为它就是它的设计目标。
如果我们使用Boost.Python,那么Python也与luabind非常相似,虽然使用C API会更加痛苦并且开始时会更加繁琐(我们不能只建立一个静态链接的库并且去那里)我们必须处理很多环境变量,如sys.path,并确保我们使用正确的Python实现来调试/发布版本)。
你也可以选择其他语言,但我知道的两个最流行的语言提供C ++库,使绑定更容易。
您也可以使用SWIG并支持多种脚本语言,但SWIG需要相当长的时间才能学习,因为它有大量的文档,需要注意很多细节,因为它适用于许多不同的语言
答案 1 :(得分:4)
如果要向C ++应用程序添加脚本语言,可以嵌入LUA: http://www.lua.org/home.html