如何向指定签名的std::unordered_map中添加函数引用?
解决方法
首先要注意类型匹配问题:你声明的std::unordered_map中,std::function的签名是int(stm&, const uint64_t),但你的write函数返回值是bool,两者类型不兼容,必须先解决这个问题才能将函数加入map。
下面提供三种可行的处理方式:
方式一:修改write函数的返回值,匹配map的签名
将write的返回值从bool改为int,直接满足map的函数类型要求:
// 修改后的write函数 int write(stm& s, const uint64_t item) { std::cout << "op: " << s.st_out << std::endl; return 1; // 用int值表示执行结果,比如1代表成功 } // 添加到map中(示例键为0x100,可替换为你需要的uint64_t键值) instruction_actions[0x100] = &write; // 或者用emplace方法,效率更高 instruction_actions.emplace(0x100, &write);
方式二:调整unordered_map的函数签名,适配write的返回值
如果你不想修改write函数,可以把map中std::function的返回类型改为bool:
// 修改后的map声明 std::unordered_map<uint64_t, std::function<bool(stm&, const uint64_t)>> instruction_actions; // 添加write函数到map instruction_actions[0x100] = &write; // 或者使用emplace instruction_actions.emplace(0x100, &write);
方式三:用lambda表达式做类型适配(保留原map和write函数)
如果既不想修改map签名,也不想改动write函数,可以用lambda作为中间层做类型转换:
// 用lambda包装write,将bool返回值转为int instruction_actions[0x100] = [](stm& s, const uint64_t item) -> int { // 根据write的返回值返回对应的int,比如成功返回1,失败返回0 return write(s, item) ? 1 : 0; };
额外提示
你提供的stm结构体定义末尾缺少分号,这会导致编译错误,需要补充:
struct stm { size_t op; std::string st_out; }; // 这里需要加分号
内容的提问来源于stack exchange,提问作者awwd
相关产品推荐
相关产品推荐

