草庐IT

c++ - c++ 程序遵循用户定义脚本的最佳方式?

coder 2024-02-09 原文

我有一个模拟程序,它以特定顺序多次重复一组函数,然后输出基于这些函数的一些计算结果。每个函数都会以某种方式改变 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 脚本来创建模拟器并在其上调用函数并获得完整 lua 语言及其基础库的所有功能,在每次调用时计算数学表达式,创建用户定义的函数、闭包、lambda 等。并且就脚本语言而言,lua 是速度之王。

实际上,我在一天之内就成功地将一个规模相当大的商业 C++ 程序变成了一个完全可编写脚本的 Lua 程序。它非常容易嵌入,因为这就是它的设计目的。

还有 Python,如果我们使用 Boost.Python,它与 luabind 非常相似,尽管使用 C API 会更痛苦,并且开始时会更乏味(我们不能只构建一个静态链接库然后去那里我们必须处理许多环境变量,例如 sys.path 并确保我们使用正确的 Python 实现来调试/发布版本)。

您还可以选择其他语言,但我所知道的这两种最流行的语言提供了 C++ 库,使绑定(bind)变得更加容易。

您也可以使用 SWIG 并开箱即用地支持多种脚本语言,但 SWIG 需要相当长的时间来学习,因为它有大量文档,其中包含许多您必须注意的细节,因为它适用于多种不同的语言.

关于c++ - c++ 程序遵循用户定义脚本的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9532245/

有关c++ - c++ 程序遵循用户定义脚本的最佳方式?的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  3. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  9. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  10. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

随机推荐