You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向指定签名的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:50:26