在 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<void()>
。如果,例如您的函数返回 int,您可以替换为 std::function<int()>
。【参考方案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++ 中执行存储为字符串的函数的主要内容,如果未能解决你的问题,请参考以下文章