【问题标题】:Map of Boolean Functions with A Single Argument具有单个参数的布尔函数映射
【发布时间】:2017-05-10 11:06:48
【问题描述】:

我没有太多编写 C++ 的经验,而且我正在努力解决一个问题。下面的代码是从 sn-ps 中拼凑出来的。我正在编写一个类,我希望它具有字符串键和函数值的属性映射:

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++ 的了解还不足以提出解决方案。

谁能指出错误我正在犯(以及为什么会抛出它;我想学习)并提供改进建议

【问题讨论】:

  • 您的地图访问权限可能有错字。如果您使用[] 搜索您的函数并且它不在地图中,它会使用您搜索的键创建一个新条目,并为您的函数创建一个虚拟条目(空指针?还没有尝试过)。如果您随后调用虚拟函数,则会引发异常。尝试使用map.find() 并检查返回的迭代器!= map.end() 是否在您的地图中。
  • 谢谢!我试图访问尚未设置的密钥。很傻。这解决了它。

标签: c++ lambda runtime-error


【解决方案1】:

What causes std::bad_function_call?

缺少或空的功能。调用函数前一定要检查map中是否存在“some_key”,

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

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

if(selection_filters["some_key"])

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

【讨论】:

  • 这与@AlexanderS 上面给出的答案一致。它解决了这个问题。谢谢!
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多