是否可以执行存储为字符串的函数?例如执行以下形式的功能:
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++ 的内部结构。
不,因为 C++ 是一种静态编译语言,所以这不可能直接实现。函数和变量名称(通常)在编译期间丢失。正如大卫建议的那样,除了使用共享库/DLL之外,您还可以使用 astd::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的文档。
你最好尝试 python、ruby 甚至 matlab 而不是 c++。
但是如果你坚持,你可以尝试将 LUA 集成到你的项目中。
它可以解决你的问题。