ホームページ >バックエンド開発 >C++ >C で (std::string に保存された) 関数を名前で呼び出すにはどうすればよいですか?

C で (std::string に保存された) 関数を名前で呼び出すにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 07:04:311039ブラウズ

How Can I Call Functions by Name (Stored in a std::string) in C  ?

C での名前による関数の呼び出し (std::string)

C では、ファイルに格納されている名前で関数を直接呼び出すことはできません。弦。ただし、この機能を実現するための回避策は存在します。

基本的なアプローチ

基本的なアプローチには、一連の "if-else" ステートメントまたは "switch-case" の使用が含まれます。構造体を作成し、文字列に格納されている関数名を明示的にチェックし、対応する関数を呼び出します。提供されたコード スニペットに示されているように、このメソッドでは関数とその名前のリストを手動で維持する必要があります。

Reflection

質問で提案されているアプローチは次のように呼ばれます。リフレクション。これには、実行時にプログラム要素に動的にアクセスして操作することが含まれます。リフレクションは C ではネイティブにサポートされていませんが、一部のライブラリでは限定的なリフレクション機能が提供されています。

std::map を使用した回避策

回避策の 1 つは、次の std::map を作成することです。関数名 (std::string キー) を関数ポインター (int (*FnPtr)(int, int) 値) に関連付けます。これにより、名前に基づいた関数の効率的な取得と呼び出しが可能になります。

提供されたコード スニペットは、このアプローチを示しています。

<code class="c++">#include <iostream>
#include <map>

int add(int i, int j) { return i + j; }
int sub(int i, int j) { return i - j; }

typedef int (*FnPtr)(int, int);

int main() {
    std::map<std::string, FnPtr> myMap;
    myMap["add"] = add;
    myMap["sub"] = sub;

    std::string s("add");
    int res = myMap[s](2, 3);
    std::cout << res;
}</code>

この例では、myMap[s](2, 3) ) 式は、文字列「add」に関連付けられた関数ポインターを取得し、引数 2 と 3 を指定して呼び出します。その結果、出力は 5.

以上がC で (std::string に保存された) 関数を名前で呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。