这是对earlier question的续集问题(不同主题)。下面的代码结合Dehstil的建议使用专业化。模板模板参数的专业化
具有模板模板参数的函数应该如何专用?
下面的代码(其中两个专业化行不编译)使问题具体化。
#include <cassert>
template<typename S> struct PA1 {};
template<typename S> struct PA2 {};
template<typename S> struct PB {};
template<typename S> struct PC {};
template<typename S> struct A1 { typedef PA1<S> P; };
template<typename S> struct A2 { typedef PA2<S> P; };
template<typename S> struct B { typedef PB <S> P; };
template<typename S> struct C { typedef PC <S> P; };
template<typename S, template<typename> class T> char fn(typename T<S>::P);
template<typename S, template<typename> class T> char fn(typename T<S>::P)
{
return 'a';
}
template<typename S> char fn<B<S> >(B<S>::P) { return 'b'; }
template<typename S> char fn<C<S> >(C<S>::P) { return 'c'; }
int main()
{
PA1<int> pa1;
PA2<int> pa2;
PB<int> pb;
PC<int> pc;
assert((fn<int, A1>(pa1)) == 'a');
assert((fn<int, A2>(pa2)) == 'a');
assert((fn<int, B>(pb)) == 'b');
assert((fn<int, C>(pc)) == 'c');
}
这四个功能重要的电话FN < ...,...>()调用时具有相同的特征,因为他们自己会驻留在适用于四类A1/A2模板类/公元前。
签名变得不同,这就排除了在通用类中使用fn! – Calaf 2011-04-13 05:06:55
@ user704972:过载可以具有相同的名称;实际上这就是超载的意思。 – Nawaz 2011-04-13 05:08:13
我的意思是这个。假设我们现在有一个'template struct Foo {void g(...){... fn()...}};其中T可以是A1/A2/B/C中的任何一个。由于fn()仅以一种形式出现(例如,作为fn ()或fn()),其四种类型的定义也必须相同。 –
Calaf
2011-04-13 05:16:29