C++ 直接从用户输入调用,是否有在运行时生成函数的概念?

C++ 直接从用户输入调用,是否有在运行时生成函数的概念?,c++,function,C++,Function,有没有办法直接从用户输入的内容调用函数 例如:如果用户输入greet,则调用名为greet的函数 我不希望调用生成任何案例或比较 #include <iostream> #include<string> using namespace std; void nameOfTheFunction(); // prototype int main() { string nameOfTheFunction; getline(cin,nameOfTheFunction); /

有没有办法直接从用户输入的内容调用函数

例如:如果用户输入
greet
,则调用名为
greet
的函数

我不希望调用生成任何案例或比较

#include <iostream>
#include<string>
using namespace std;

void nameOfTheFunction(); // prototype

int main() {
string nameOfTheFunction;

getline(cin,nameOfTheFunction);  // enter the name of Function

    string newString = nameOfTheFunction + "()"; // !!!

cout << newString;

// now call the function nameOfTheFunction

}

void nameOfTheFunction() {
cout << "hello";
}
#包括
#包括
使用名称空间std;
函数()的无效名称;//原型
int main(){
函数的字符串名;
getline(cin,函数名);//输入函数名
字符串newString=函数名+“()”;/!!!
cout
你的意思是运行时函数生成??

不

但是,如果您已经知道用户可能提供哪些字符串作为输入(即您正在限制输入),则可以使用映射

对于以上内容,您可能可以使用
std::map< std::string,boost::function<..>>


检查Boo::函数

简而言之,不可能。C++中的名字变成内存偏移(地址),然后名字被丢弃**。在运行时C++对其实际运行的函数或方法名称一无所知。


**如果调试符号被编译,那么符号就在那里,但不可访问。

< p>在运行时生成函数有很多缺点(如果可能的话),通常没有很好的理由用C++语言来做它。,许多提供了一个
eval()
函数,可以解释类似字符串的脚本代码并执行它

如果你真的需要在编译语言如C++中有一些类似于Value>代码的东西,你有几个选项:

  • 定义自己的脚本语言并为其编写解析器/解释器(大量工作)
  • 定义一种非常简单的命令式语言或数学语言,可以使用众所周知的设计模式(如解释器)轻松解析和评估
  • 使用可以通过库轻松集成到代码中的现有脚本语言(例如:Lua)
  • 通过外部解释器或编译器填充要在运行时执行的代码字符串,并通过操作系统执行它们,或者使用dlopen/LoadLibrary/etc将它们加载到程序中
  • (3.)可能是最简单和最好的方法。如果您希望将外部依赖性保持在最低限度,或者如果您需要直接访问主程序中的功能和状态,我建议您选择(2)请注意,在这种情况下,您可以回调到自己的代码中,因此从脚本调用本机函数不是问题


    如果您可以选择Java或C#之类的语言,还可以选择使用运行时本身内置的编译器。

    您实际上可以在堆上生成全新的函数并执行它们(或者如您所说的“运行时函数生成”)。但是op说的是按名称调用预定义函数。@Chris我如何在堆上生成新函数并执行它们?@Chris:如果需要调用预定义函数,那么使用映射就是一种方法。对吗?我不知道如何生成运行时函数,我会搜索一下,然后返回:)@Chris:你能指出t吗o一些我可以看到函数在运行时如何在堆上生成的源代码?基本上,过程是这样的:分配一些内存,确保页面标记为可执行(因平台而异),并将机器代码发送到此内存。然后,您只需将指令指针移动到此代码的开头,然后bam——您刚刚动态生成了一个函数。当然,这低于C级别,您需要非常好地理解您的确切体系结构。而C本身也不知道这段内存代表可执行代码e--所以不要崩溃,那会很不愉快。在运行时基于用户输入等因素调用特定函数是a的定义(尽管我要指出这一点)。您仍然需要关联(map)带有函数的特定字符串可以执行您想要执行的操作。@AusCBloke:hmm…我看不出这对操作有什么帮助。从总体上看,它看起来像类型擦除一样简单