2017-05-09 6 views
0

多くの異なる型を受け入れる関数、例えばdoubleとcomplexを記述したいと思います。私はまた、型が複素数であるときにprint 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_float(double)'と 'univ_float(complex)'を持っています)テンプレートは実際に扱うことができるタイプの束を持っている場合、あるいは大部分は同じものです。 /または特定の過負荷。ここで実際に何を達成しようとしていますか? – cdhowie

+0

@cdhowie:良いアイデア、ありがとう!それが私が望むものです。 –

+1

表示したいほとんどの型に対して 'basic_ostream :: operator <<'がすでに定義されている場合、なぜあなたは 'printf'を使用していますか?追加の要件は 'univ_print'を特化することで処理できます。 – paddy

答えて

1

テンプレートはタイプはここインターフェース

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

を共有する場合のためのより便利で、我々は、プリミティブを含むインターフェースoperator+ですべてのタイプを受け入れsum関数を作成しています。

ここで、いくつかのタイプがインターフェイスを共有していない場合は、それらを特化/過負荷にする必要があります。それが起こると、関数テンプレートのオーバーロードは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... 
}; 

そして、あなたはあなただけの代わりにテンプレートを使用して、異なるタイプの `univ_printを()`オーバーロードすることができ

Complex c; 
std::cout << c << std::endl; 
関連する問題