ホームページ >バックエンド開発 >C++ >さまざまなシグネチャを持つ関数を C のマップに保存するにはどうすればよいですか?

さまざまなシグネチャを持つ関数を C のマップに保存するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-19 09:26:03403ブラウズ

How can I store functions with varying signatures in a map in C  ?

さまざまなシグネチャを持つ関数をマップに保存する

C では、さまざまなシグネチャを持つ関数をマップに保存する必要がある場合があります。ここで、キーは文字列、値はジェネリック メソッドです。これは最初は難しいように思えるかもしれませんが、型消去とテンプレート演算子の助けを借りて可能です。

型消去

マップ内に異なるシグネチャを持つ関数を保存できるようにするには、まずそれらをコンテナーにタイプ消去します。これには、関数の型を、マップに保存したりマップから取得したりできる共通の表現に変換することが含まれます。

Template Operator

関数の型が型消去されると、マップ用のテンプレート演算子 () を提供します。この演算子はストアド関数を入力として受け取り、実行時に特定のパラメーターを使用してそれを呼び出すことができます。指定されたパラメーターは、元の関数のシグネチャと正確に一致する必要があります。そうでない場合、オペレーターは std::bad_any_cast 例外をスローします。

これを実装する方法の例を次に示します。

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

template<typename Ret>
struct AnyCallable
{
    //...
};

void foo(int x, int y)
{
    //...
}

void bar(std::string x, int y, int z)
{
    //...
}

using namespace std::literals;

int main()
{
    // Initialize the map
    std::map<std::string, AnyCallable<void>> map;

    // Store functions in the map
    map["foo"] = &foo;
    map["bar"] = &bar;

    // Call the stored functions with parameters
    map["foo"](1, 2);
    map["bar"]("Hello, std::string literal"s, 1, 2);
}

この例では、関数を型消去し、テンプレート演算子を提供するラッパー構造体 AnyCallable を定義します。

考慮事項

  • 型消去のため、元の関数のシグネチャと正確に一致するパラメーターを指定する必要があることに注意することが重要です。
  • パラメータが一致しないストアド関数を呼び出そうとすると、オペレータは std::bad_any_cast をスローします。例外。

以上がさまざまなシグネチャを持つ関数を C のマップに保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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