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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-14 15:54:02399瀏覽

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

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

在C 中,使用字串鍵和通用函數作為值建立映射帶來了挑戰。然而,利用類型擦除和模板化運算子()的組合,這是可以實現的。

類型擦除允許在單一容器中儲存不同的函數類型,而模板化運算子()提供對儲存的函數。下面的程式碼範例示範了這種方法:

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

在此解決方案中,AnyCallable 類別充當儲存函數的包裝器,提供模板化的operator()。函數指標 &foo 和 &bar 在儲存到 m_any 成員之前會轉換為 std::function 物件。當呼叫儲存的函數時,它們會被轉換為適當的函數類型並執行。

需要注意的是,由於類型擦除,必須在呼叫站點提供匹配的參數。此外,函數參數的常數性很重要,因為可以使用相同數量的參數但不同的限定符來建立不同的重載。

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

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