Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza-beza dalam peta menggunakan C ?

Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza-beza dalam peta menggunakan C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-11 21:59:02473semak imbas

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

Menyimpan Fungsi dengan Tanda Tangan Berbeza dalam Peta

Dalam kod ini, kami berhasrat untuk mencipta peta yang menyimpan fungsi dengan tandatangan yang berbeza-beza, memanfaatkan rentetan sebagai kunci dan kaedah generik sebagai nilai.

Melaksanakan Peta

Kami menggunakan std:: mana-mana perpustakaan untuk mencapai matlamat ini. Dengan memadam taip jenis fungsi ke dalam bekas, kita boleh mencipta fungsi operator() templat untuk memanggilnya secara dinamik. Walau bagaimanapun, adalah penting untuk menentukan padanan hujah yang tepat di tapak panggilan untuk mengelakkan pengecualian std::bad_any_cast.

Contoh Pelaksanaan

Pertimbangkan coretan kod berikut:

#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;
}

Kod ini menunjukkan cara menyimpan dan menggunakan fungsi dengan tandatangan berbeza dalam peta, menggunakan pemadaman jenis dan operator templat().

Atas ialah kandungan terperinci Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza-beza dalam peta menggunakan C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn