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

基于模板的C++通用回调注册遇类型转换错误:求解决方案

基于HTTP服务器组件的模板回调注册编译问题

我正在开发一个基于HTTP的服务器组件,用于处理入站请求。每个请求对应特定路径,可注册对应的callback/std::function来实现该路径下的业务逻辑。

目标是对请求体做序列化/反序列化,请求体通过类模板Body以类型安全的方式访问,其类型可以是std::string或Protobuf message等,我把该类型作为模板参数传入std::function。

我用模板实现了通用的std::function注册API,架构包含:

  • Request基类
  • Body模板类
  • ISerializable接口及SerA、SerB模板子类
  • Handler类,用于管理回调映射

调用Handler的add方法时出现如下编译错误:

Error C2664 'std::function<void (Body<ISerializable *> &)>::function(std::nullptr_t) noexcept': cannot convert argument 1 from 'std::function<void (Body &)>' to 'std::nullptr_t'

我有以下疑问:

  1. 是否误用了模板?
  2. 能否用模板解决该问题?若可以,我遗漏了什么?
  3. 编译器为何不允许将Body<SerA>传递给Body<ISerializable*>?
  4. 是否需要为回调添加包装类来完成转换?
  5. 是否可通过std::variant或可变参数模板解决该问题?

内容的提问来源于stack exchange,提问作者Dirk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:27:21