我正在编写一个类似数组的类 A <class T>
模板,我想专门处理一些成员函数来处理数组的数组A<A<T>>
。
这是一个接近我想要的工作示例:
#include "stdio.h"
//primary template class
template <class T> class A {
public: void f() {printf("A<T>::fn");}
};
//1st solution : specialization (?) of A for A<A<T>>
template <class T> class A< A<T> > {
public: void f() {printf("A<A<T>>::fn");}
};
//2nd solution : specialization of A::f for A<A<int>>
template<> void A< A<int> >::f() {
printf("A<A<int>>::fn");
}
int main(void) {
A<int> A_int;
A< A<int> > A_A_int;
A< A<double> > A_A_double;
A_int.f(); // ok : prints A<T>::f
A_A_int.f(); // ok : prints A<A<int>>::f
A_A_double.f(); // ok : prints A<A<T>>::f
return 0;
}
第一个解决方案的问题是我必须从主模板类中复制很多成员函数
我试图从小学类派生,但
template <class T> class A< A<T> > : public A< A<T> >
毫无意义
第二个解决方案的问题在于我必须为每个可能的类型复制专用化,这违背了模板类的目的。
既然可以定义template<> void A< A<int> >::f()
,似乎应该能够将这种专业化"模板化"为任何类型。我试过了:
template <class T> template<> void A< A<T> >::f()
template <template <class T> > void A< A<T> >::f()
template <template <> class T> void A< A<T> >::f()
和其他荒谬的语法...
所以。。。我可以模板化专业化template<> void A< A<int> >::f()
不仅适用于 int 而且适用于任何类型的 T 吗?
提前感谢,
此致敬意
一种可能的方法:
#include <cstdio>
// forward declaration
template<typename>
class A;
template<typename>
class A_Base {
// general case
public: void f() { printf("A<T>::fn"); }
};
// partial specialization for any A
template<typename T>
class A_Base< A<T> > {
// special stuff
public: void f() { printf("A<A<T>>::fn"); }
};
template<typename T>
class A : private A_Base<T> { // private inheritance, we're not modeling IS-A
public:
using A_Base<T>::f; // make f accesible
// all the other stuff that doesn't need to change
};
int main()
{
A<int> a1;
A<A<int>> a2;
a1.f(); // A<T>::f
a2.f(); // A<A<T>>::f
}
这样,您只将需要不同行为的函数放在基类中。您当然可以使其反之亦然 - 您将公共代码放在基类中,并专门化一个派生类,您还可以在其中定义f
。