C++无需显式特化能否推导模板参数?编译器推导辅助方案问询
错误根本原因
C++的模板参数推导阶段不会考虑用户定义的隐式转换,只会做严格的类型模式匹配:调用foo(s)时传入的实参类型是S<int, 10>,而foo的形参类型是A<T>,二者没有直接的模式匹配关系,编译器不会主动扫描所有可能的隐式转换路径来推导T,因此推导失败。
解决方案
下面给出几种不需要显式指定模板参数的解决方式:
1. 新增foo的重载适配S类型
不需要修改原有A、S和原foo的逻辑,只要新增一个接收S参数的重载即可,对调用方完全无感知:
template<typename T, int N> void foo(S<T, N> arg) { // 内部隐式转换为A<T>后调用原foo实现 foo(A<T>(arg)); }
添加后foo(s)可以直接正常编译运行。
2. 调用时显式完成类型转换
如果不方便修改函数定义,可以在调用处手动做一次类型转换,C++17及以上版本可以直接用类模板实参推导简化写法:
// 自动推导A的模板参数为int,等价于foo(A<int>(s)) foo(A(s));
如果使用C++11/14,写法为foo(A<int>(s))。
内容的提问来源于stack exchange,提问作者M.K.
相关产品推荐
相关产品推荐

