2

文字列として保存された関数を実行することは可能ですか? たとえば、次の形式で関数を実行するには:

string str="myFunction()";

-> here i would like to execute "myFunction()";

ありがとうございました!

4

7 に答える 7

2

それを共有ライブラリにコンパイルし、そのライブラリをロードして、それを呼び出す必要があります。それはできますが、きれいではありません。ほとんどの場合、あなたがやろうとしていることは何でも行うための良い方法があります。

于 2013-03-04T09:50:30.430 に答える
2

Davidが言ったこととは別に、各ノードに関数の名前と関数へのポインターが含まれるマッピングを作成することもできます。次に、マッピングでノードを名前で検索し、関数ポインターを呼び出します。これは、すべての関数が同じプロトタイプを持つことを前提としています。

于 2013-03-04T09:53:50.443 に答える
0

いいえ、C ++は静的にコンパイルされた言語であるため、これを直接行うことはできません。関数名と変数名は(通常)コンパイル中に失われます。共有ライブラリ/DLLを使用する以外に、Davidが提案したように、を使用し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のドキュメントも参照してください。

于 2013-03-04T10:00:59.633 に答える
0

Qt ライブラリとQMetaObject::invokeMethodを使用できます

QMetaObject::invokeMethod( pObject, "myFunction" );
于 2013-03-04T09:58:31.167 に答える
0

C++ の代わりに、python、ruby、または matlab を試してみてください。

しかし、あなたが主張するなら、あなたのプロジェクトに LUA を統合することを試みることができます。

それはあなたの問題を解決することができます。

于 2013-03-04T10:14:42.213 に答える
0

また、指定した文字列を処理および評価する言語パーサーを作成して埋め込むこともできます。

参考文献:

于 2013-03-04T11:25:34.837 に答える
0

これは、関数が一部の DLL ファイルからエクスポートされたときに実行できます。

void (*myFunction)();
HMODULE library = LoadLibrary("LIBRARY.DLL");

myFunction = GetProcAddress(library, "myFunction");

myFunction();

FreeLibrary(library);

しかし、これはまさにあなたが望むものではありません。C++ の内部構造を理解していないためです。

于 2013-03-04T09:59:10.920 に答える