基于模板的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'
我有以下疑问:
- 是否误用了模板?
- 能否用模板解决该问题?若可以,我遗漏了什么?
- 编译器为何不允许将
Body<SerA>传递给Body<ISerializable*>? - 是否需要为回调添加包装类来完成转换?
- 是否可通过
std::variant或可变参数模板解决该问题?
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

