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

C++ subclassing in template parameters

我有一个给定的 C++ 代码,它使用模板并声明一个 class C<T1, B1<T2> > 和一个 class B1 作为模板参数。我现在希望 C<T1, B2<T2> > 做与 B1 完全相同的事情,除了一些我为 B2 明确重新声明的函数。下面是一个从 B1.

继承 B2 的小例子
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() 中声明的函数。

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 进行进一步限制。