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
Lepaskan: 2024-11-11 21:59:02
asal
473 orang telah melayarinya

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan