2011-07-10 7 views
1

私は混乱しています。私は何を使用するか、テンプレート、またはオーバーロードされた機能を決して決めるように見えません。オーバーロードにはより多くのコーディングが必要です。どのような場合にテンプレートを使用するのが好ましいか、どのようなオーバーロードされた関数ですか?テンプレートはいつ使用しなければなりませんか?

たとえば、私は最近、小さなGBAゲームを作る際にこの決定を下さなければなりませんでした。 u16intの2種類あり、オーバーロード機能を使用することにしました。

inline void Point::Move(int x, int y) {_ix += x; _iy += y; } 
inline void Point::Move(u16 x, u16 y) {_ix += (int) x; _iy += (int) y; } 

代わりにテンプレートを使用する必要がありますか?どのような場合には、私はオーバーロードされた関数を使うべきですか?

答えて

8

基本ルールは次のようになります。

使用テンプレートあなたは異なるデータ型同じ機能/操作を実行したいとき。

使用オーバーロード関数あなたは異なる/同じデータ型

上/運用異なる機能を実行する場合ときにも、あなたが本当にテンプレート上でオーバーロードされた関数を必要とするときの良い尺度でありますテンプレート版の関数に対してあまりにも多くの明示的な特殊化を行っています。

例では、両方のバージョンの関数で同じ操作を実行する場合、テンプレートを使用する必要があります。そうでない場合は、オーバーロードされた関数を使用する必要があります。

+3

** moer BOLDを害することはできますか?**(+1) – Mehrdad

+0

@Mehrdad:あなたのコメントを理解できませんでした.. –

+2

@Als彼は、あなたが**たくさんのボールドテキストを持っていることを意味しました** – ApprenticeHacker

3

私が見る限り、テンプレートソリューションは同じコンパイル済みオブジェクトになりますが、ソース内で繰り返しは発生しません。テンプレートのための明確な勝利。

私は、より多くのメモリを必要とするテンプレートについてのポイントを理解していません。それは霧のように聞こえる。

+0

これは、私がフォーラムを読むことによって得られる誤った情報のようなものです。 "テンプレートにはもっと記憶が必要です!!!"と "テンプレートは遅いです!!!"テンプレートに対しては百代、テンプレートに対しては百代、すごい答えのためにその – ApprenticeHacker

+0

(+1)について申し訳ありません。 :) – ApprenticeHacker

+3

私はテンプレートの使用は、コンパイラの人生を困難にすることができると思います。コンパイル時に特定のタイプに変換されるため(テンプレートを使用するとコンパイル時間が遅くなる可能性があるため)、メモリ/スローバイブレーションの原因は、おそらく –

1

通常は、使用するタイプが分かっているときに関数をオーバーロードします。

通常、使用しているタイプ間に実際の論理的な違い(異なるコード)がある場合、関数をオーバーロードします。
実際のタイプと特性を知っているので、これを行うことができます。

テンプレートのパワーは、一度関数を書いてから、任意のタイプのメソッドを使用できるということです。
しかし、テンプレートは、与えられたタイプに合うように一般的なものでなければなりません。

関連する問題