C ++模板专业化和子类化

Jac*_*lue 5 c++ inheritance templates

我想知道是否可以让模板专门化接受一个类及其子类。像这样:

class A {};

class B : public A {};

template <typename T>
void foo(const T& t) {
  printf("T");
}

template <>
void foo(const A& t) {
  printf("A");
}

int main(int argc, char** argv) {
  B b;
  foo(b);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当前它输出“ T”是因为b没有自己的模板特化功能,因此它默认打印为“ T”。我想知道是否可以B使用的模板专门化,A因为B是的子类A。还是那不是一回事?

注意:由于某些要求,我无法使用复制/移动。

注意:如果我不需要更改AB,我也希望它先让我们看看有什么可能。

son*_*yao 4

问题是,当T推导为时,主模板是完全匹配的B;这是比专业化更好的匹配。

您可以使用模板重载来代替;与SFINAE

template <typename T>
std::enable_if_t<!std::is_base_of_v<A, T>> foo(const T& t) {
  printf("T");
}

template <typename T>
std::enable_if_t<std::is_base_of_v<A, T>> foo(const T& t) {
  printf("A");
}
Run Code Online (Sandbox Code Playgroud)

居住