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> >

意味がありません

2 番目の解決策の問題は、考えられるすべての型の特殊化を複製する必要があり、テンプレート クラスの目的が無効になることです。

を定義することが可能であるため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

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 に答える