C では、異なるシグネチャを持つ関数を一意のシグネチャと関連付ける必要があります。実行時引数に基づく動的呼び出しの識別子。ただし、標準コンテナは、非同種関数型の格納を直接サポートしていません。
この制限を克服する 1 つのアプローチは、関数のカプセル化を伴う型消去です。特定の型情報を消去するコンテナに型を追加します。これにより、さまざまなシグネチャを持つ関数を均一に保存できるようになります。このプロセスを容易にするために、カスタム データ構造 AnyCallable が定義されています。
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; };
AnyCallable は、異種の関数タイプを受け入れ、一致する引数でカプセル化された関数を呼び出すための汎用の Operator() を提供します。
AnyCallable データ構造を使用して、さまざまなシグネチャを持つ関数を格納するマップを作成できます。
std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; map["bar"] = &bar;
一意の文字列識別子に基づいて関数を動的に呼び出すには、 AnyCallable:
map["foo"](1, 2); map["bar"]("Hello", 1, 2);
によって提供される Operator() を利用します。このアプローチにより、型の安全性と、非同種のシグネチャを持つ関数の動的呼び出しが保証され、異なる入力を持つメソッド ポインターを保存および実行するための多用途のソリューションになります。
以上がC のマップに同種でないシグネチャを持つ関数を格納するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。