文字列として保存された関数を実行することは可能ですか? たとえば、次の形式で関数を実行するには:
string str="myFunction()";
-> here i would like to execute "myFunction()";
ありがとうございました!
それを共有ライブラリにコンパイルし、そのライブラリをロードして、それを呼び出す必要があります。それはできますが、きれいではありません。ほとんどの場合、あなたがやろうとしていることは何でも行うための良い方法があります。
Davidが言ったこととは別に、各ノードに関数の名前と関数へのポインターが含まれるマッピングを作成することもできます。次に、マッピングでノードを名前で検索し、関数ポインターを呼び出します。これは、すべての関数が同じプロトタイプを持つことを前提としています。
いいえ、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のドキュメントも参照してください。
Qt ライブラリとQMetaObject::invokeMethodを使用できます
QMetaObject::invokeMethod( pObject, "myFunction" );
C++ の代わりに、python、ruby、または matlab を試してみてください。
しかし、あなたが主張するなら、あなたのプロジェクトに LUA を統合することを試みることができます。
それはあなたの問題を解決することができます。
また、指定した文字列を処理および評価する言語パーサーを作成して埋め込むこともできます。
参考文献:
これは、関数が一部の DLL ファイルからエクスポートされたときに実行できます。
void (*myFunction)();
HMODULE library = LoadLibrary("LIBRARY.DLL");
myFunction = GetProcAddress(library, "myFunction");
myFunction();
FreeLibrary(library);
しかし、これはまさにあなたが望むものではありません。C++ の内部構造を理解していないためです。