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