c++中以字符串形式存储的Execute函数

execute function stored as a string in c++

本文关键字:存储 Execute 函数 字符串 c++      更新时间:2023-10-16

是否可以执行存储为字符串的函数?例如:

执行一个函数
string str="myFunction()";
-> here i would like to execute "myFunction()";

谢谢!

您必须将其编译为共享库,加载该库并调用它。这是可以做到的,但并不漂亮。最有可能的是,无论你想做什么,都有一个好方法。

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

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

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

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

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

但这并不是你想要的。

不,因为c++是一种静态编译语言,这是不可能的。函数名和变量名(通常)在编译过程中丢失。除了像David建议的那样使用共享库/DLL之外,您还可以使用std::map并将您的函数存储在其中,例如(未经测试):

#include <functional>
#include <iostream>
#include <unordered_map> // or just <map>
void myFunction() {
    std::cout << "in myFunctionn";
}
void anotherFunction() {
     std::cout << "in anotherFunctionn";
 }
 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的文档

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

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

可以解决你的问题。

您还可以创建和嵌入语言解析器,该解析器处理和计算您提供的字符串。

进一步阅读:

  • 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——可以帮助你的工具