模板参数中的C ++子类化

时间:2015-02-03 11:08:02

标签: c++ templates

我有一个给定的C ++代码使用模板并声明一个类C<T1, B1<T2> >,类B1作为模板参数。我现在希望C<T1, B2<T2> >B1完全相同,除了我为B2明确重新声明的一些函数。以下是从B2继承B1的小例子。

template <typename T1>
class B1 {};

template <typename T1>
class B2: public B1<T1> {};

template <typename T1, typename T2>
class C;

template <typename T1, typename T2>
class C<T1, B1<T2> >
{
public:
    C(int i) {
        // do sth.
    }
};

template <typename T1, typename T2>
int getVal(C<T1, B2<T2> >& b2) {
    return 2;
}

template <typename T1, typename T2>
int getVal(C<T1, B1<T2> >& b1) {
    return 1;
}

template <typename T1, typename T2>
int doSomething(C<T1, B1<T2> >& c) {
    return getVal(c);
}

int main()
{
    C<int, B1<int> > c1(1);
    C<int, B2<int> > c2(1);
    cout << doSomething(c1); // output 1
    cout << doSomething(c2); // output 2
    return 0;
}

我想更改getVal()的实施,而无需重新声明doSomething()C<T1, B2<T2> >。不幸的是,这不起作用(错误:变量C<int, B2<int> > c2具有初始化程序但不完整的类型)。

是否有任何优雅的方式,而无需重新声明C及其所有功能?

P.S。:根据评论在main()中修复声明的函数。

1 个答案:

答案 0 :(得分:1)

C ++模板专业化基于模式匹配。它不使用继承。

template <typename T1, typename T2> class C<T1, B1<T2> >

仅匹配B1,就上述而言,B2是不相关的类型。您的错误发生在doSomething代码之前很久,它现在是一个红色的鲱鱼。

要做的第一件事是修复上面的代码段:

template <class T1, template<class>class B, class T2>
class C<T1, B<T2> >

现在它的模式匹配B1B2。接下来对doSomething执行相同的操作:

template <class T1, template<class>class B, class T2>
int doSomething(C<T1, B<T2> >& c)

并且代码应该可以工作。

如果需要,可以通过SFINAE进一步限制。