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

时间:2011-12-23 07:13:22

标签: c++ function

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

例如:如果用户输入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";
}

是否存在在运行时生成函数的概念?

3 个答案:

答案 0 :(得分:2)

你的意思是运行时函数生成?

没有。

但如果您已经知道用户可能将哪些字符串作为输入(即您限制输入),则可以使用地图。

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

检查boost :: function HERE

答案 1 :(得分:0)

简而言之,这是不可能的。 C ++中的名称变为内存偏移量(地址),然后丢弃名称**。在运行时,C ++不知道它实际运行的函数或方法名称。

**如果编译了调试符号,那么符号就在那里,但是访问它是不切实际的。

答案 2 :(得分:0)

在运行时生成函数有很多缺点(如果可能的话),并且通常没有充分的理由在像C ++这样的语言中执行它。你应该把它留给脚本语言(比如Perl或Python),很多都提供了一个eval()函数,它可以解释像脚本代码这样的字符串并执行它。

如果你确实需要在编译语言(例如C ++)中使用eval()之类的东西,那么你有几个选择:

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

    如果您可以选择Java或C#等语言,还可以选择使用内置于运行时本身的编译器。 Have a look here for how to do this in Java