Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何继承一个具有多个分区专门化接口的类_C++_C++11_Templates - Fatal编程技术网

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
}