在映射中儲存具有不同簽章的函數
在C 中,使用字串鍵和泛型函數作為值建立映射是一項挑戰。然而,利用類型擦除和模板化運算子()的組合,這是可以實現的。
類型擦除允許在單一容器中儲存不同的函數類型,而模板化運算子()提供對儲存的函數。下面的程式碼範例示範了這種方法:
#include <any> #include <functional> #include <map> #include <string> template<typename Ret> struct AnyCallable { template<typename ... Args> Ret operator()(Args&& ... 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"] = &foo; map["bar"] = &bar; map["foo"](1, 2); map["bar"]("Hello", 1, 2); }
在此解決方案中,AnyCallable 類別充當儲存函數的包裝器,提供模板化的operator()。函數指標 &foo 和 &bar 在儲存到 m_any 成員之前會轉換為 std::function 物件。當呼叫儲存的函數時,它們會被轉換為適當的函數類型並執行。
需要注意的是,由於類型擦除,必須在呼叫站點提供匹配的參數。此外,函數參數的常數性很重要,因為可以使用相同數量的參數但不同的限定符來建立不同的重載。
以上是如何在 C 中的映射中儲存具有不同簽名的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!