C++ : 如何为模板类 A 专门化成员函数来处理类似数组的类 A<T>< >?



我正在编写一个类似数组的类 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

最新更新