マップに個別のシグネチャを持つ関数を保存する
C では、文字列キーと汎用関数を値として持つマップを作成するのが困難です。ただし、型消去とテンプレート化された Operator() の組み合わせを利用すると、これを実現できます。
型消去により、単一のコンテナーにさまざまな関数型を格納できるようになり、テンプレート化された Operator() は、ストアド関数。以下のコード例は、このアプローチを示しています。
#include <any> #include <functional> #include <map> #include <string> template<typename Ret> struct AnyCallable { template<typename ... Args> Ret operator()(Args&& ... 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"] = &foo; map["bar"] = &bar; map["foo"](1, 2); map["bar"]("Hello", 1, 2); }
このソリューションでは、AnyCallable クラスがストアド関数のラッパーとして機能し、テンプレート化された Operator() を提供します。関数ポインター &foo および &bar は、m_any メンバーに格納される前に std::function オブジェクトに変換されます。ストアド関数が呼び出されると、適切な関数型にキャストされて実行されます。
型の消去のため、呼び出しサイトで一致する引数を指定する必要があることに注意することが重要です。さらに、同じ数の引数で異なる修飾子を使用して異なるオーバーロードを作成できるため、関数の引数の const 性は重要です。
以上がC のマップに異なるシグネチャを持つ関数を保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。