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

C のマップに同種でないシグネチャを持つ関数を格納するにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-11-18 07:53:02
オリジナル
257 人が閲覧しました

How Can You Store Functions with Non-Homogeneous Signatures in a Map in C  ?

同種でないシグネチャを持つ関数をマップに保存する

問題の概要

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 サイトの他の関連記事を参照してください。

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