c++ - 具有单个参数的 bool 函数映射

标签 c++ lambda runtime-error

我没有太多编写 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)> 之间的差异有关在 map 定义中,以及 lambda 函数的使用 [] (std::string value) { ... };

我非常想保留 lambda 函数的使用以及通过映射 (map['some_key'](..)) 上的下标运算符访问函数的可能性,但我对 C++ 的了解不足以提出解决方案。

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

最佳答案

参见 What causes std::bad_function_call?

缺少或空函数。在调用该函数之前,请务必检查映射中是否存在“some_key”,

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

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

if(selection_filters["some_key"])

当您在 std::map 上使用 [] 运算符时,它将插入一个默认构造对象(或零)(如果它不在 map 中) .这可能(并且将会)导致您未明确设置的 key 出现大量无效条目。

关于c++ - 具有单个参数的 bool 函数映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43890693/

相关文章:

c++ - 继承类函数比基类需要更多的输入

c++ - 通过属性 getter 访问 std::map 返回垃圾值

c++ - 从另一个 Form C++/CLI 引用 TabControls

c++ - STL迭代器进入构造函数

c++11 - std::function 是如何为 lambda 构造的

c# - 从 lambda 返回数组索引但抛出 IndexOutOfRangeException

javascript - 如何将Lambda函数中的Mongo Atlas数据库与Mongoose连接

java - 将简单的 CDI 托管 bean 注入(inject) servlet 时 Bluemix Liberty 中出现错误

java - 为什么 Android 应用程序在 runtimeException 后自动重启?

java - Android Studio 找不到资源