【问题标题】:execute function stored as a string in c++在 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 ?

标签: c++ string function


【解决方案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_mapstd::function 的文档。

        【讨论】:

        • 谢谢!如果函数返回值,您的建议是否也有效?例如一个整数?因为如果函数返回值,我在使用上述映射解决方案时遇到了困难。
        • main()的第一行,我声明了函数的类型为std::function&lt;void()&gt;。如果,例如您的函数返回 int,您可以替换为 std::function&lt;int()&gt;
        【解决方案6】:

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

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

        它可以解决你的问题。

        【讨论】:

          【解决方案7】:

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

          进一步阅读:

          【讨论】:

            猜你喜欢
            • 2011-01-07
            • 1970-01-01
            • 2017-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多