c++ - 当两个模板参数属于同一类型时,如何执行部分特化?
问题描述
如何偏特化两个模板参数是同一类型。
如何使用第二个函数制作此代码。
#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;
}
期待推出“转发功能”。
解决方案
问题是根本无法调用第二个版本。您将第一个参数声明为fowarding reference,当被传递时,lvlaueA
将被推断为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) {
...
}
BTW:函数模板不能部分特化;正如您的代码所示,它们只能重载。
推荐阅读
- javascript - 如何使用 Bootstrap 5 和 JQuery(或纯 JS)在多个选项卡中共享按钮组的状态?
- c# - DateTimeOffset.ToString() 格式化输出在环境中不一致
- python - 删除熊猫中的一系列字符
- python-3.x - 连接到 PySpark 会话时出现以下错误
- reactjs - React Apollo 3 graphQL 理解重新渲染的机制
- django - django 应用程序的 Heroku 部署后数据库错误
- css - SASS 动态字符串变量
- python - 有什么方法可以在不改变图像纵横比的情况下使用 python pptx 包在 pptx 中拟合图像
- python - 连接到远程计算机上的 Jupyter Notebook 时出现问题
- javascript - 尝试使用 Escape 键将输入的值设置为原始值