是否有等效于Eval的C/C++("function(arg1,arg2)")?

Dip*_* KC 23 c++ eval

它需要一种方法来调用函数,其名称存储在类似于eval的字符串中.你能帮我吗?

Hau*_*eth 24

C++没有反射,所以你必须破解它,即:

#include <iostream>
#include <map>
#include <string>
#include <functional>

void foo() { std::cout << "foo()"; }
void boo() { std::cout << "boo()"; }
void too() { std::cout << "too()"; }
void goo() { std::cout << "goo()"; }

int main() {
  std::map<std::string, std::function<void()>> functions;
  functions["foo"] = foo;
  functions["boo"] = boo;
  functions["too"] = too;
  functions["goo"] = goo;

  std::string func;
  std::cin >> func;
  if (functions.find(func) != functions.end()) {
    functions[func]();
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ore 8

至少有两种选择:

  • 命令模式.
  • 在Windows上,您可以使用GetProcAddress按名称获取回调,并使用dlopen+ dlsymon*nix.

  • @DipeshKc我相信你可以轻松地找到一个(对于两种选择)与谷歌. (5认同)

小智 7

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;


double eval( string expression );


int main( int argc, char *argv[] )
{
    string expression = "";
    for ( int i = 1; i < argc; i++ )
    {
       expression = expression + argv[i];
    }
    cout << "Expression [ " << expression << " ] = " << endl;

    eval( expression );
}


double eval( string expression )
{
    string program = "";
    program = program + "#include <cmath>\n";
    program = program + "#include <iostream>\n";
    program = program + "using namespace std;\n";
    program = program + "int main()\n";
    program = program + "{\n";
    program = program + "   cout << ";
    program = program + expression;
    program = program + " << endl;\n";
    program = program + "}";


    ofstream out( "abc.cpp" );
    out << program;
    out.close();

    system( "g++ -o abc.exe abc.cpp" );
    system( "abc" );
}
Run Code Online (Sandbox Code Playgroud)

  • 编译代码的编译程序。应该注意,这并不适用于所有平台。 (4认同)

Tom*_*sen 5

您可以尝试采用现有的脚本引擎,将您喜欢的功能公开给它,然后使用它来评估您的语句。V8 引擎就是这样的一种引擎: https: //developers.google.com/v8/intro,但有许多替代方案和不同的语言可供选择。

这里有些例子: