Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyimpan Fungsi dengan Tandatangan Berbeza dalam Peta dalam C?

Bagaimana untuk Menyimpan Fungsi dengan Tandatangan Berbeza dalam Peta dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-14 15:54:02407semak imbas

How to Store Functions with Different Signatures in a Map in C  ?

Menyimpan Fungsi dengan Tanda Tangan Berbeza dalam Peta

Dalam C , mencipta peta dengan kekunci rentetan dan fungsi generik kerana nilai menimbulkan cabaran. Walau bagaimanapun, dengan menggunakan gabungan pemadaman jenis dan operator templat(), ini boleh dicapai.

Pemadaman jenis membenarkan penyimpanan jenis fungsi yang berbeza dalam satu bekas, manakala operator templat() menyediakan akses kepada fungsi yang disimpan. Contoh kod di bawah menunjukkan pendekatan ini:

#include <any>
#include <functional>
#include <map>
#include <string>

template<typename Ret>
struct AnyCallable
{
    template<typename ... Args>
    Ret operator()(Args&amp;&amp; ... args) { ... }
    std::any m_any;
};

void foo(int x, int y) { ... }
void bar(std::string x, int y, int z) { ... }

int main()
{
    std::map<std::string, AnyCallable<void>> map;
    map["foo"] = &amp;foo;
    map["bar"] = &amp;bar;
    
    map["foo"](1, 2);
    map["bar"]("Hello", 1, 2);
}

Dalam penyelesaian ini, kelas AnyCallable bertindak sebagai pembalut di sekeliling fungsi yang disimpan, menyediakan operator templat(). Penunjuk fungsi &foo dan &bar ditukar kepada objek std::function sebelum disimpan dalam m_any member. Apabila fungsi yang disimpan dipanggil, ia dihantar ke jenis fungsi yang sesuai dan dilaksanakan.

Adalah penting untuk ambil perhatian bahawa disebabkan pemadaman jenis, argumen yang sepadan mesti disediakan di tapak panggilan. Tambahan pula, ketegasan argumen fungsi adalah penting, kerana lebihan yang berbeza mungkin dibuat dengan bilangan argumen yang sama tetapi kelayakan yang berbeza.

Atas ialah kandungan terperinci Bagaimana untuk Menyimpan Fungsi dengan Tandatangan Berbeza dalam Peta dalam 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