假设我有一个班级A
和一个模板函数I<T>
。
我有一个部分版本I<A>
。
现在,我需要向A
添加一些数据成员。因此,我尝试使用类A
继承B
。但是,现在将执行函数I<T>
而不是I<A>
。
我可以在不丢失接口B
的情况下获得扩展课程I<A>
吗?
我更喜欢不修改函数I
和类A
,因为它们实际上非常复杂,属于第三方。
**手动投射也不可行,因为B&
将投放到A
。
编辑:
我真正感兴趣的是为什么多态似乎不适用于分区专业化?有什么不对或只是C ++表现如此吗?
示例代码
#include<iostream>
using namespace std;
class A {};
class B: public A {};
template <typename T>
void print(T t) {
cout << "base template method" << endl;
}
template <>
void print(A t) {
cout << "partitional template method" << endl;
}
int main() {
A a;
print(a); // partitional method
B b;
print(b) // base method
print<A>(b); // partitional method
}
I<A>(b)
工作正常,但我的情况也是不可接受的<A>
。我需要我(b)工作正常。
答案 0 :(得分:0)
让B b; I(b);
导致I
A
专精化的唯一方法是为B
调用它。但是,您可以将B
分配给A&
变量,并将其传递给I
,这将使用A
专业化。
模板专精化仅适用于after deduction类型的完全匹配。
#include<iostream>
using namespace std;
class A {};
class B: public A {};
template <typename T>
void print(T& t) {
cout << "base template method" << endl;
}
template <>
void print(A& t) {
cout << "specialisation for A of template method" << endl;
}
template <>
void print(B& t) {
cout << "specialisation for B of template method" << endl;
print<A>(t);
}
int main() {
A a;
print(a); // A specialisation used
B b;
print(b); // B specialisation used, which calls A specialisation
print<A>(b); // A specialisation used
A & ab = b;
print(ab); // A specialisation used
}