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

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

Mary-Kate Olsen
リリース: 2024-11-14 15:54:02
オリジナル
407 人が閲覧しました

How to Store Functions with Different Signatures in a Map in C  ?

マップに個別のシグネチャを持つ関数を保存する

C では、文字列キーと汎用関数を値として持つマップを作成するのが困難です。ただし、型消去とテンプレート化された Operator() の組み合わせを利用すると、これを実現できます。

型消去により、単一のコンテナーにさまざまな関数型を格納できるようになり、テンプレート化された Operator() は、ストアド関数。以下のコード例は、このアプローチを示しています。

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

template<typename Ret>
struct AnyCallable
{
    template<typename ... Args>
    Ret operator()(Args&amp;&amp; ... args) { ... }
    std::any m_any;
};

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

int main()
{
    std::map<std::string, AnyCallable<void>> map;
    map["foo"] = &amp;foo;
    map["bar"] = &amp;bar;
    
    map["foo"](1, 2);
    map["bar"]("Hello", 1, 2);
}
ログイン後にコピー

このソリューションでは、AnyCallable クラスがストアド関数のラッパーとして機能し、テンプレート化された Operator() を提供します。関数ポインター &foo および &bar は、m_any メンバーに格納される前に std::function オブジェクトに変換されます。ストアド関数が呼び出されると、適切な関数型にキャストされて実行されます。

型の消去のため、呼び出しサイトで一致する引数を指定する必要があることに注意することが重要です。さらに、同じ数の引数で異なる修飾子を使用して異なるオーバーロードを作成できるため、関数の引数の const 性は重要です。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート