2017-05-09 70 views
0

我想寫一個接受許多不同類型的函數,比如double和complex。我也想打印他們的成員,比如打印double值,當這個類型是double時,打印這個類型是複雜的實部和虛部。一個打印不同類型成員的函數

如果我使用模板,會出現錯誤,因爲double不能有實部和虛部。

template<class T> 
void univ_print(T t) 
{ 
if(typeid(T)==typeid(double)) 
printf("%f\n",t); 

else if(typeid(T)==typeid(complex)) 
printf("%f\t%f\n",t.real, t.imag); 


} 

這是行不通的。那麼我怎樣才能獲得我想要的效果。

謝謝!

+5

你可以只重載'univ_print()'爲不同類型的,而不是使用的模板。 (例如'univ_float(double)'和'univ_float(complex)')。只有當你有一堆可以被視爲相同的類型時,模板纔會起作用,或者大部分是相同的, /或特定的過載。你究竟想在這裏實現什麼? – cdhowie

+0

@cdhowie:好主意,謝謝!這就是我想要的。 –

+1

爲什麼在你使用'printf'的時候,'basic_ostream :: operator <<'已經定義了你想要顯示的大多數類型。任何額外的需求都可以通過專門的'univ_print'來處理。 – paddy

回答

1

模板,其中類型共享

template<typename T> 
T sum(T a, T b) 
{ 
    return a + b; 
} 

在這裏,我們正在創建的sum功能,接受所有類型的接口operator+,其中包括原語界面的案件更加有用。

現在,如果有幾種類型不共享一個接口,你需要做的是專門爲他們/重載。碰巧,重載函數模板是often superior專門。

將輸出函數添加到自定義類型的(幾乎標準的)方法是爲流重載operator<<

class Complex 
{ 
    double real, imag; 
    friend std::ostream& operator<<(std::ostream& os, const Complex& c) 
    { 
     return os << c.real << '\t' << c.imag; 
    } 
    // public methods... 
}; 

然後你就可以寫

Complex c; 
std::cout << c << std::endl; 
相關問題