如何继承具有一堆分区专业化接口的类

时间:2017-03-24 06:14:23

标签: c++ c++11 templates

假设我有一个班级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)工作正常。

1 个答案:

答案 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
}