2

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

string str="myFunction()";

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

谢谢!

4

7 回答 7

2

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

于 2013-03-04T09:50:30.430 回答
2

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

于 2013-03-04T09:53:50.443 回答
0

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

进一步阅读:

于 2013-03-04T11:25:34.837 回答
0

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

QMetaObject::invokeMethod( pObject, "myFunction" );
于 2013-03-04T09:58:31.167 回答
0

当函数从某个 DLL 文件中导出时,您可以执行此操作。

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

myFunction = GetProcAddress(library, "myFunction");

myFunction();

FreeLibrary(library);

但这并不是你想要的。因为您不了解 C++ 的内部结构。

于 2013-03-04T09:59:10.920 回答
0

不,因为 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_mapstd::function的文档。

于 2013-03-04T10:00:59.633 回答
0

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

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

它可以解决你的问题。

于 2013-03-04T10:14:42.213 回答