具有单个参数的布尔函数映射

Map of Boolean Functions with A Single Argument

本文关键字:布尔 函数 映射 参数 单个      更新时间:2023-10-16

我没有很多写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++的了解不足以提出解决方案。

有人可以指出我犯的错误(以及为什么抛出它;我想学习(并提供改进建议

请参阅导致 std::bad_function_call 的原因是什么?

函数缺失或为空。 在调用函数之前,请务必检查映射中是否存在"some_key",

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

或者至少检查函数是否具有有效的目标:

if(selection_filters["some_key"])

当您在std::map上使用 [] 运算符时,如果它尚未在映射中,它将插入默认构造对象(或零(。 这可能会(并且会(导致您未显式设置的键出现大量无效条目。