首页 > 解决方案 > C++ 模板特化和子类化

问题描述

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

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

目前它输出'T',因为b没有自己的模板特化,所以它默认打印'T'。我想知道是否可以B使用模板专业化,A因为B它是A. 或者那不是一回事?

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

注意:如果我不需要更改Aor B,我也更喜欢,但让我们先看看有什么可能。

标签: c++templatesinheritance

解决方案


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");
}

居住


推荐阅读