2013-07-29 96 views
-3

我想知道如何重載模板類。如果我有以下課程。我想創建不同類型的T.模板類重載

template <class T> 
class A { 
    T data; 
public: 
    void print_data(void); 
} 

的不同功能,如果T是double類型,我需要一個像下面的僞代碼的函數:

template <class T> 
void A<double>::print_data(){ 
    printf("%g",date); 
} 

如果T是複合型的,我需要這樣工作:

template <class T> 
void A< complex<double> >::print_data(){ 
    printf("%g+%gi",data.real(),date.imag()); 
} 

我應該如何實現這個目標。謝謝!

我找到一個解決方案,但我認爲它不是很好。基本思想是使用輸入參數進行重載。

template <class T> 
class A { 
public: 
    T data; 
    void print_data(double); 
    void print_data(complex<T>);  
} 

template <class T> 
void A<T>::print_data(double){ 
    printf("%g",date); 
} 
template <class T> 
void A<T>::print_data(complex<T>){ 
    printf("%g+%gi",data.real(),date.imag()); 
} 

int main(void) 
{ 
    //just demonstrate the idea, may not work 
    A<double> ddata; 
    A<complex> cdata; 
    ddata.data = 2.0; 
    cdata.data = complex(1,2); 

    ddata->print_data(ddata); 
    cdata->print_data(cdata); 
    return 0; 
} 

有沒有人有更好的解決辦法?

+0

你有沒有試過? (不要忘記函數返回類型!) –

+0

對於Skippy,我想創建print_data()函數。我在這裏給的是錯誤的,他們只是展示我想要得到的東西。 – lengfei

+0

對大衛:是的,我已經嘗試了上面的代碼與返回類型,我得到一個編譯錯誤。 – lengfei

回答

1

只需專注您的模板函數的具體類型:

template <> 
void A<double>::print_data() 
{ 
    std::cout << data << std::endl; 
} 
template<> 
void A<complex<double> >::print_data(){ 
    std::cout << data.real() << "+" << data.imag() << std::endl; 
} 
+0

此解決方案強制您重新定義每個模板專業化中常見的所有內容。 –