在 C++ 中执行存储为字符串的函数

Posted

技术标签:

【中文标题】在 C++ 中执行存储为字符串的函数【英文标题】:execute function stored as a string in c++ 【发布时间】:2013-03-04 09:47:31 【问题描述】:

是否可以执行存储为字符串的函数? 例如以以下形式执行功能:

string str="myFunction()";

-> here i would like to execute "myFunction()";

谢谢!

【问题讨论】:

C++ 未被解释。 这显然是一个XY问题,你想解决一些问题X,而Y是你如何看待解决方案,所以你问如何做Y。如果你解释X是什么你正在解决,我们可能能够对如何解决 X 问题给出更好的答案。可能下面的答案之一是正确的,但您也很可能不想要其中任何一个,而是完全不同的东西...... 你工作的环境是什么 .. linux 还是 windows ? 【参考方案1】:

您必须将它编译成一个共享库,加载该库,然后调用它。它可以做到,但它并不漂亮。最有可能的是,有一种好方法可以做任何你想做的事情。

【讨论】:

【参考方案2】:

除了 David 所说的之外,您还可以创建一个映射,其中每个节点都包含函数的名称和指向函数的指针。然后在映射中按名称查找节点并调用函数指针。这假设所有函数都具有相同的原型。

【讨论】:

【参考方案3】:

你可以使用Qt库和QMetaObject::invokeMethod

QMetaObject::invokeMethod( pObject, "myFunction" );

【讨论】:

【参考方案4】:

当函数从某个 DLL 文件中导出时,您可以这样做。

void (*myFunction)();
HMODULE library = LoadLibrary("LIBRARY.DLL");

myFunction = GetProcAddress(library, "myFunction");

myFunction();

FreeLibrary(library);

但这并不是你想要的。因为你不了解 C++ 的内部原理。

【讨论】:

如果你有函数列表并且你有字符串并且你想调用一个函数,你可以用 strcmp 做一系列 if-then-elsefi。【参考方案5】:

不,因为 C++ 是一种静态编译语言,所以这不可能直接实现。函数和变量名称(通常)在编译期间丢失。正如大卫建议的那样,除了使用共享库/DLL 之外,您还可以使用 std::map 并将您的函数存储在其中,例如(未经测试):

#include <functional>
#include <iostream>
#include <unordered_map> // or just <map>

void myFunction() 
    std::cout << "in myFunction\n";


void anotherFunction() 
     std::cout << "in anotherFunction\n";
 

 int main() 
    std::unordered_map<std::function<void()>> functions; // or just std::map

    // Store the functions
    functions["myFunction"] = &myFunction;
    functions["anotherFunction"] = &anotherFunction;

    // Call myFunction
    functions["myFunction"](); // Prints "in myFunction".
 

正如 c.fogelklou 所说,函数必须具有兼容的原型;通过字符串传递参数甚至需要编写解析器。

另请参阅 std::unordered_map 和 std::function 的文档。

【讨论】:

谢谢!如果函数返回值,您的建议是否也有效?例如一个整数?因为如果函数返回值,我在使用上述映射解决方案时遇到了困难。 main()的第一行,我声明了函数的类型为std::function&lt;void()&gt;。如果,例如您的函数返回 int,您可以替换为 std::function&lt;int()&gt;【参考方案6】:

你最好尝试 python、ruby 甚至 matlab 而不是 c++。

但如果你坚持,你可以尝试将 LUA 集成到你的项目中。

它可以解决你的问题。

【讨论】:

【参考方案7】:

您还可以创建和嵌入一个语言解析器,用于处理和评估您提供的字符串。

进一步阅读:

http://en.wikipedia.org/wiki/Parsing#Programming_languages---起点 http://en.wikipedia.org/wiki/Domain-specific_language --- 这就是你想要做的事情 http://www.boost.org/doc/libs/1_53_0/libs/spirit/doc/html/index.html --- 可以帮助你的工具

【讨论】:

以上是关于在 C++ 中执行存储为字符串的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何计算特定字母在字符串中出现的次数? (C++)

执行 C++ 中字符串中提供的 Python 函数

在 C++ 中是不是可以强制执行字符串文字函数参数?

如何创建一个存储指向成员函数的指针的类 (C++)

出错时停止代码执行 (C++)

如何从字符串列表中删除引号并将其再次存储为列表..?