首頁 > 後端開發 > C++ > 主體

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

Mary-Kate Olsen
發布: 2024-11-14 15:54:02
原創
327 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板