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

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

Susan Sarandon
Susan Sarandonasal
2024-11-19 09:26:03352semak imbas

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

Menyimpan Fungsi dengan Pelbagai Tandatangan dalam Peta

Dalam C , anda mungkin menghadapi keperluan untuk menyimpan fungsi dengan tandatangan yang berbeza-beza dalam peta, di mana kuncinya ialah rentetan dan nilainya ialah kaedah generik. Walaupun ini pada mulanya kelihatan mencabar, ia boleh dilakukan dengan bantuan pemadaman jenis dan pengendali templat.

Pemadaman Jenis

Untuk mendayakan fungsi menyimpan dengan tandatangan berbeza dalam peta , kami mula-mula menaip-memadamkannya ke dalam bekas. Ini melibatkan penukaran jenis fungsi kepada perwakilan biasa yang boleh disimpan dan diambil daripada peta.

Operator Templat

Setelah jenis fungsi telah dipadamkan, kami menyediakan operator templat () untuk peta. Operator ini mengambil fungsi tersimpan sebagai input dan membolehkan kami memanggilnya dengan parameter tertentu semasa masa jalan. Parameter yang disediakan mesti sepadan dengan tandatangan fungsi asal dengan tepat. Jika tidak, pengendali akan memberikan pengecualian std::bad_any_cast.

Contoh

Berikut ialah contoh bagaimana ini boleh dilaksanakan:

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

template<typename Ret>
struct AnyCallable
{
    //...
};

void foo(int x, int y)
{
    //...
}

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

using namespace std::literals;

int main()
{
    // Initialize the map
    std::map<std::string, AnyCallable<void>> map;

    // Store functions in the map
    map["foo"] = &foo;
    map["bar"] = &bar;

    // Call the stored functions with parameters
    map["foo"](1, 2);
    map["bar"]("Hello, std::string literal"s, 1, 2);
}

Dalam contoh ini, kami mentakrifkan struktur pembalut AnyCallable yang memadam taip fungsi dan menyediakan operator templat () untuk memanggilnya.

Pertimbangan

  • Adalah penting untuk ambil perhatian bahawa disebabkan pemadaman jenis, anda mesti menentukan parameter yang betul-betul sepadan dengan tandatangan fungsi asal.
  • Jika anda cuba memanggil fungsi yang disimpan dengan parameter yang tidak sepadan, pengendali akan membuang std::bad_any_cast exception.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza-beza 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