このコードでは、文字列をキーとして利用し、さまざまなシグネチャを持つ関数を保存するマップを作成することを目的としています。一般的なメソッドを値として使用します。
これを実現するには std::any ライブラリを使用します。関数型をコンテナーに型消去することで、それらを動的に呼び出すテンプレートのoperator()関数を作成できます。ただし、 std::bad_any_cast 例外を回避するには、呼び出しサイトで引数の正確な一致を指定することが重要です。
次のコード スニペットを検討してください。
#include <any> #include <functional> #include <map> #include <string> #include <iostream> using namespace std::literals; template<typename Ret> struct AnyCallable { AnyCallable() {} template<typename F> AnyCallable(F&& fun) : AnyCallable(std::function(std::forward<F>(fun))) {} template<typename ... Args> AnyCallable(std::function<Ret(Args...)> fun) : m_any(fun) {} template<typename ... Args> Ret operator()(Args&& ... args) { return std::invoke(std::any_cast<std::function<Ret(Args...)>>(m_any), std::forward<Args>(args)...); } std::any m_any; }; void foo(int x, int y) { std::cout << "foo" << x << y << std::endl; } void bar(std::string x, int y, int z) { std::cout << "bar" << x << y << z << std::endl; } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; //store the methods in the map map["bar"] = &bar; map["foo"](1, 2); //call them with parameters I get at runtime map["bar"]("Hello, std::string literal"s, 1, 2); try { map["bar"]("Hello, const char *literal", 1, 2); // bad_any_cast } catch (std::bad_any_cast&) { std::cout << "mismatched argument types" << std::endl; } map["bar"].operator()<std::string, int, int>("Hello, const char *literal", 1, 2); // explicit template parameters return 0; }
このコードは、型消去とテンプレートを利用して、マップ内に異なるシグネチャを持つ関数を保存して呼び出す方法を示しています。演算子().
以上がC を使用してさまざまなシグネチャを持つ関数をマップに保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。