2

我正在编写一个模板<class T>类数组 A 类,我想专门处理一些成员函数来处理数组数组A<A<T>>

这是一个接近我想要的工作示例:

#include "stdio.h"

//primary template class 
template <class T> class A {
public: void f() {printf("A<T>::f\n");}
};

//1st solution : specialization (?) of A for A<A<T>>
template <class T> class A< A<T> > {
public: void f() {printf("A<A<T>>::f\n");}
};

//2nd solution : specialization of A::f for A<A<int>>
template<> void A< A<int> >::f() {
    printf("A<A<int>>::f\n");
}

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 ?

提前致谢,

此致,

4

1 回答 1

1

一种可能的方式:

#include <cstdio>

// forward declaration
template<typename>
class A;

template<typename>
class A_Base {
    // general case
    public: void f() { printf("A<T>::f\n"); }
};

// partial specialization for any A
template<typename T>
class A_Base< A<T> > {
    // special stuff
    public: void f() { printf("A<A<T>>::f\n"); }
};

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

于 2013-10-01T22:24:07.117 回答