【问题标题】:Convert std::string to existing function with parameters in C++使用 C++ 中的参数将 std::string 转换为现有函数
【发布时间】:2012-06-18 19:38:58
【问题描述】:

我的项目中有一个已实现的函数MyFunc(int, double, string)。如何使用具有字符串表示的必要参数调用此函数,例如

std::string str = "MyFunc(2, 3.12, \"Lemon Juice\")";

那么标准函数呢,例如,我如何调用 time()std::string "time()"


好的,这里有更详细的任务。 我有一个map <string, Data> Data 是一个有很多孩子的类包装器。当我调用Data.GetValue() 方法时,它返回一个std::string,具体取决于子类内部数据。 Data 一个孩子必须返回 int 的字符串表示,另一个 - double 的字符串表示,最后一个 - 当前日期和时间的字符串表示。这就是问题所在 - 我不知道如何调用标准函数 ctime() 以从 Data 孩子之一获取信息。

【问题讨论】:

  • 不容易。您希望能够调用 任何 函数,还是只调用几个特定的​​函数?
  • 这是脚本语言的主要应用。许多脚本语言也可以很好地与 C++ 集成,以 LUA 为例。
  • 你需要这个做什么?正如其他人所说,这是非常非常困难的。对于您的需要,可能有更简单的替代方案。
  • 这让我想起了我想读的博客:runtimecompiledcplusplus.blogspot.fr
  • 史蒂夫,你是对的,我已经更正了描述。当然,Data 不是抽象类。

标签: c++ function


【解决方案1】:

您不能一般在 C++ 中执行源代码包含在字符串中的代码。可能最引人注目的动机是 C++ 实现不需要在运行代码的机器上安装 C++ 编译器,尽管它不仅如此。

您可以针对特定情况执行此操作。那可能是:

特定于平台的,例如:

  • 将源代码封装在一些样板文件中,然后在外部调用编译器、链接它或将其嵌入到您的程序中。这为您提供了一个程序或库。
  • 在外部运行该新程序,或动态链接该库。

输入特定,例如:

  • 您可以使用文字作为参数,相对容易地解析对特定已知函数的函数调用,而无需完整的 C++ 编译器。将参数值取出到变量中并调用函数。但如果您要这样做,您可以为字符串指定一种更容易解析的格式,而不是看起来像 C++ 函数调用的格式。

听起来好像在你的任务中你有一个字符串是以下之一:

  • int 的表示
  • double 的表示
  • 日期和时间的表示。

你没有说你想用这个字符串做什么,但不管是什么,你可能需要 (a) 检查字符串以找出它是三个字符串中的哪一个,然后 (b) 做一些适当的事情那种格式。更好的是,无论三个GetValue() 返回哪个,都可以让派生类负责返回相同的表示。例如,如果您真正想要的是自 1970 年以来的秒数,则添加一个 GetSecondsSinceEpoc 函数,并在每个类中以不同的方式实现它。

【讨论】:

    【解决方案2】:

    正如其他人所提到的,C++ 本身无法做到这一点。但是,外部框架可以帮助您。

    ROOT(在 CERN 使用)为 C++ 提供反射以及解释器。您将能够在代码中执行/解释用 C++ 编写的方法调用或宏。

    【讨论】:

    • 由于计算机安全团队发现的安全问题,ROOT 网站已关闭,应该很快就会恢复...
    【解决方案3】:

    使用 C++ 无法做到这一点。

    【讨论】:

    • 虽然或多或少(有 C++ 脚本库)准确,但这并没有真正的帮助……
    • 他当然可以,他只需要编写一个解析器,将这些字符串转换为调用。我的公司有一个库,可以为数百甚至数千个库函数执行此操作。
    • 我可以在家中使用任何开源的吗?还是本地项目?
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2013-10-30
    • 2012-09-19
    • 2023-03-21
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多