首頁  >  文章  >  後端開發  >  如何在 C 的映射中儲存具有不同簽名的函數?

如何在 C 的映射中儲存具有不同簽名的函數?

Susan Sarandon
Susan Sarandon原創
2024-11-19 09:26:03351瀏覽

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

在映射中儲存具有不同簽名的函數

在C 中,您可能會遇到需要在映射中儲存具有不同簽名的函數,其中鍵是字串,值是通用方法。雖然這最初看起來可能具有挑戰性,但在類型擦除和模板運算符的幫助下是可能的。

類型擦除

啟用在映射中儲存具有不同簽名的函數,我們首先將它們鍵入擦除到容器中。這涉及將函數類型轉換為可以在映射中儲存和檢索的通用表示。

模板運算子

一旦函數類型被類型擦除,我們為地圖提供了一個模板運算符 ()。該運算符將儲存的函數作為輸入,並允許我們在運行時使用特定參數呼叫它。提供的參數必須與原始函數簽章完​​全匹配。如果不這樣做,運算子將拋出 std::bad_any_cast 例外。

範例

以下是如何實現的範例:

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

在這個範例中,我們定義了一個包裝結構AnyCallable,它可以對函數進行類型擦除,並提供模板運算子() 來呼叫它們。

注意事項

  • 需要注意的是,由於類型擦除,您必須指定與原始函數簽名完全匹配的參數。
  • 如果您嘗試使用不符合的參數呼叫儲存函數,則運算子將拋出 std: :bad_any_cast 例外。

以上是如何在 C 的映射中儲存具有不同簽名的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn