ホームページ >バックエンド開発 >C++ >C を使用してさまざまなシグネチャを持つ関数をマップに保存するにはどうすればよいですか?

C を使用してさまざまなシグネチャを持つ関数をマップに保存するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-11 21:59:02473ブラウズ

How can I store functions with varying signatures in a map using C  ?

マップに異なるシグネチャを持つ関数を保存する

このコードでは、文字列をキーとして利用し、さまざまなシグネチャを持つ関数を保存するマップを作成することを目的としています。一般的なメソッドを値として使用します。

マップの実装

これを実現するには 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。