2013-10-01 82 views
2

我正在編寫一個模板<class T>類似數組的類A,我想專門化幾個成員函數來處理數組數組A<A<T>>C++:如何專門化模板的成員函數數組類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; 
} 

與第1解決方案的問題是,我必須從主模板類

我複製了大量的成員函數試圖從主類派生但

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?

由於提前,

最好的問候,

+1

類模板的成員函數本身就是函數模板,但是當然,您不能部分地專用函數模板。但是,您可以將您的templae的常見部分分解爲基類,並只更改專業化中的可修改部分。 –

回答

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

+0

「普通的東西」應該是「一般情況」嗎? –

+0

@KerrekSB的確聽起來更好 – jrok

+0

我想你甚至可以從'A_Base '遞歸地推導'A_Base < A>'來提供一個通用的'f'函數。 – dyp