在映射中儲存具有不同簽名的函數
在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,它可以對函數進行類型擦除,並提供模板運算子() 來呼叫它們。
注意事項
以上是如何在 C 的映射中儲存具有不同簽名的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!