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
。还是那不是一回事?
注意:由于某些要求,我无法使用复制/移动。
注意:如果我不需要更改A
或B
,我也希望它先让我们看看有什么可能。
问题是,当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)
归档时间: |
|
查看次数: |
185 次 |
最近记录: |