2017-05-10 87 views
0

我沒有很多編寫C++的經驗,而且我正在努力解決一個問題。下面的代碼是從片段一起刮掉的。我寫一個類,我希望它有字符串鍵和函數值的屬性圖:具有單參數的布爾函數的映射

std::map< std::string, std::function<bool(std::string)> > selection_filters;

然後我要添加對如下:

auto some_func = [] (std::string value) { return value == "some_val"; }; 

selection_filters["some_key"] = some_func; 
//or 
selection_filters.insert(std::make_pair("some_key", some_func)); 

,這樣我可以:

if (selection_filters["some_key"]("function param") == true) { 

//etc.. 

} 

這將編譯,但在運行時拋出一個錯誤:

terminating with uncaught exception of type std::__1::bad_function_call: std::exception

我懷疑它可能有一些做的地圖定義std::function<bool(std::string)>之間的差異,以及使用lambda函數的[] (std::string value) { ... };

我非常希望保留使用lambda函數和通過地圖上的下標運算符訪問函數的可能性(map['some_key'](..)),但我對C++的瞭解不足以提供解決方案。

有人可以指出錯誤我做(以及爲什麼它被拋出;我想學)改進的並提供建議?

+1

也許你在地圖訪問中有錯字。如果您使用'[]'搜索您的函數並且它不在地圖中,它將使用您搜索的鍵創建一個新條目併爲您的函數創建一個虛擬條目(空指針?沒有嘗試過)。如果你然後調用虛函數拋出異常。 嘗試使用'map.find()'並檢查返回的迭代器'!= map.end()',以檢查鍵是否在你的映射中。 – AlexanderS

+0

謝謝!我試圖訪問尚未設置的密鑰。非常愚蠢。這解決了它。 – TBZ92

回答

3

What causes std::bad_function_call?

缺少或空函數。一定要檢查「some_key」在地圖上存在調用該函數之前,

if(selection_filters.find("some_key") != selection_filters.end()) 

,或者至少檢查函數有一個有效的目標:

if(selection_filters["some_key"]) 

當您使用[]操作在std::map上,如果它尚未在地圖中,它將插入一個默認的構造對象(或零)。這可以(並且會)會導致很多無效的條目,這些條目對於您沒有明確設置的鍵值而言。

+0

這與@AlexanderS上面給出的答案一致。它解決了這個問題。謝謝! – TBZ92