将函数作为值插入std::映射时出错



我正在尝试创建一个以整数为键、以函数为值的std::map。当我尝试通过=insert()插入值时,我会得到以下错误:

错误C2207'std::对&lt_Ty1,_Ty2>:second':类模板的成员无法获取函数类型

这是示例代码:

std::map<int, std::function<void()>> myMap;
myMap[0] = [] {std::cout << "zeron"; };
myMap.insert(std::make_pair<int, std::function<void()> >(0, [] {std::cout << "zeron";} ) ) 

为什么我不能这样做,我该如何解决?

lambda不是std::函数,所以您需要做更多的工作。通常,我有一个类,其中包含一个映射作为成员,以及一个允许添加lambda的函数模板。下面是一些没有这种包装的代码。

请注意,到目前为止,在构造时初始化是最简单的方法;void((>用lambda调用(这很好(。

#include <functional>
#include <map>
#include <iostream>
template<typename fn_t>
auto to_fn(fn_t&& fn)
{
return std::function<void()>{fn};
}

int main()
{
std::map<int, std::function<void()>> map
{
{ 0, [] { std::cout << "0n"; }}
};
// map.insert(1, []{ std::cout << "1n"; }); a lambda is not a function
map.insert({ 1, std::function<void()>{ [] { std::cout << "1n"; } } });
map.insert({ 2, to_fn([] { std::cout << "2n"; }) });

map[2]();

return 0;
}

最新更新