2012-03-02 47 views
5

我有一个模拟程序,它以特定的顺序重复一组函数,然后根据这些函数输出一些计算结果。每个函数都会以某种方式改变一个模拟器对象,并且会获取可变数量的不同类型的参数。例如:C++程序遵循用户定义脚本的最佳方式?

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语句,以便确定要调用哪些函数,所以效率似乎相当低下。

任何人有任何建议吗?

回答

6

我的建议:不要发明你自己的脚本语言/翻译。

如果您想在一天内快速开始支持用户定义的脚本,请查看Lua。它可以说是嵌入到C/C++程序中的最简单的语言之一。与luabind,它更容易:

module(L) 
[ 
    class<Simulator>("Simulator") 
     .def("A", &Simulator::A) 
     .def("B", &Simulator::B) 
     .def("C", &Simulator::C) 
]; 

完成!现在我可以运行lua脚本来创建模拟器并调用函数,并获得完整的lua语言及其基础库的所有功能,每次调用时计算数学表达式,创建用户定义函数,闭包,lambda表达式等。当谈到脚本语言时,lua是一种速度恶魔。

我实际上设法在一天内将一个相当大规模的商业C++程序变成一个完全脚本化的程序。嵌入起来非常简单,因为这就是它的设计目的。

还有一种Python与Luabind非常相似,如果我们使用Boost.Python虽然使用C API更加痛苦并且开始有点繁琐(我们不能只建立一个静态链接库并去我们必须处理很多环境变量,比如sys.path,并确保我们在调试/发布版本中使用正确的Python实现)。

你也可以选择其他语言,但是我所知道的那两种最流行的语言可以提供C++库,使绑定变得更容易。

您也可以使用SWIG并支持多种脚本语言,但SWIG需要相当长的时间才能学习,因为它有大量的文档,需要注意许多细节,因为它适用于许多不同的细节语言。

+0

谢谢。我将研究LUA,因为这听起来最适合我的需求,因为我只是想实现非常简单的脚本。 – JBentley 2012-03-02 11:33:45

+0

@JonBentley我想你会走很长的路。除了能够轻松嵌入lua支持之外,学习如何在您的应用程序中支持通用嵌入式脚本语言,可以为您未来的所有项目打开混合C++ /脚本编程的全新世界。 – stinky472 2012-03-02 11:36:39

相关问题