Zhi*_*ang 3 c++ templates partial-specialization specialization overload-resolution
两个模板参数为同一类型如何部分专业化。
如何使用第二个函数编写此代码。
#include <utility>
#include <iostream>
template <typename A, typename B>
void Translate(A&& a,B* b){
// make some translate from a to b
// b->bvalue=a.av;
std::cout<<"normal function";
}
//if a and b are same type,
template <typename A>
void Translate(A&& a, A* b) {
*b = std::forward<A>(a);
std::cout<<"forward function";
}
int main(int argc, char** argv) {
int in=0,out=0;
Translate(in,&out);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
期望输出“转发功能”。
问题在于根本无法调用第二版本。您将第一个参数声明为前向引用,当传递lvlaue时A将推导为T&。然后对于第一个参数A将推导为int&,对于第二个参数A将推导为int,它们发生冲突。
您可以std::remove_reference用于类型调整。为了解决以下歧义问题,您可以使用SFINAE,从重载集中排除不需要的专业化知识。
// if A and B are different types
template <typename A, typename B>
std::enable_if_t<!std::is_same_v<std::remove_reference_t<A>, B>> Translate(A&& a,B* b){
...
}
// if they're the same type (as A)
template <typename A>
void Translate(A&& a, std::remove_reference_t<A>* b) {
...
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句:功能模板不能部分专业化;如您的代码所示,它们只能重载。