模板参数中的 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> >
现在它的模式匹配 B1
和 B2
。接下来对 doSomething
:
做同样的事情
template <class T1, template<class>class B, class T2>
int doSomething(C<T1, B<T2> >& c)
代码应该可以工作。
如果需要,可以通过 SFINAE 进行进一步限制。
我有一个给定的 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> >
现在它的模式匹配 B1
和 B2
。接下来对 doSomething
:
template <class T1, template<class>class B, class T2>
int doSomething(C<T1, B<T2> >& c)
代码应该可以工作。
如果需要,可以通过 SFINAE 进行进一步限制。