首页 > 解决方案 > 当两个模板参数属于同一类型时,如何执行部分特化?

问题描述

如何偏特化两个模板参数是同一类型。

如何使用第二个函数制作此代码。

#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;
}

期待推出“转发功能”。

标签: c++templatesoverload-resolutionspecializationpartial-specialization

解决方案


问题是根本无法调用第二个版本。您将第一个参数声明为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:函数模板不能部分特化;正如您的代码所示,它们只能重载。


推荐阅读