C++ 如何继承一个具有多个分区专门化接口的类
假设我有一个类C++ 如何继承一个具有多个分区专门化接口的类,c++,c++11,templates,C++,C++11,Templates,假设我有一个类a和一个模板函数I。 我有一个部分版本I 现在,我需要向A添加一些数据成员。因此,我尝试用类B继承A。但是,现在将执行函数I,而不是I 有没有可能在不丢失接口的情况下获得扩展类B? 我不喜欢修改函数I和类A,因为它们实际上非常复杂,属于第三方 **手动浇铸也不可行,因为B&将被浇铸到A 编辑: 我真正感兴趣的是为什么多态性似乎不能很好地与分区专门化一起工作?有什么不对的,还是C++的行为?? 示例代码 #include<iostream> using namespace
a
和一个模板函数I
。
我有一个部分版本I
现在,我需要向A
添加一些数据成员。因此,我尝试用类B
继承A
。但是,现在将执行函数I
,而不是I
有没有可能在不丢失接口的情况下获得扩展类B
?
我不喜欢修改函数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
}
#包括
使用名称空间std;
A类{};
B类:公共A{};
模板
无效打印(T){
cout让B;I(B);
产生I
对A
的专门化的唯一方法是让B
的专门化调用它。但是,您可以将B
分配给A&
变量,并将其传递给I
,这将使用A
专门化
模板专业化仅适用于类型的精确匹配
#包括
使用名称空间std;
A类{};
B类:公共A{};
模板
作废打印(T&T){
您不能修改I
或A
,但您可以修改I
(或添加I
)吗?我也不能将类A包含为类B的数据成员。因为有很多A.func()当前项目中的代码。一般来说,类B的行为应该类似于类A,只是一些额外的成员。@kennytm我真的不想那样。我实际上引用了很多函数,所以很难添加I。我属于第三方库。但如果没有更多选项,我计划这么做。如果I
将t
作为参数您也可以将其重载为I(A)
。重载应优先于模板。@MarkusZaczek是的,但它需要复制和调整所有I。在我的情况下,代码相当多。
#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
}