私は友人と話していましたが、C++のテンプレートを使用することに完全に同意する人もいれば、まったく同意しない人もいます。
良い点のいくつかは次のとおりです。
C++テンプレートについて他にどのような良い点を教えていただけますか?
C++テンプレートについてどのような悪い点を教えていただけますか?
編集:私がこれを求めている理由の1つは、私が試験のために勉強していて、現在C++テンプレートのトピックをカバーしているということです。だから私はそれらについてもう少し理解しようとしています。
テンプレートは非常に強力なメカニズムであり、多くのことを簡素化できます。ただし、適切に使用するには、適切な使用方法を決定するために、多くの時間と経験が必要です。
私にとって最も重要な利点は次のとおりです。
for
とfor_each
の違いは何ですか)parallel_for
およびその他のSTLのようなアルゴリズムやコンテナー)欠点:
export
サポート(不足)次の本を強くお勧めします。
良い面として、C++テンプレート:
タイプの一般化を可能にする
入力する必要のある冗長コードの量を減らします
タイプセーフなコードの作成を支援する
コンパイル時に評価されます
パフォーマンスを向上させることができます(ポリモーフィズムの代替として)
非常に強力なライブラリの構築を支援する
マイナス面:
注意しないとすぐに複雑になる可能性があります
ほとんどのコンパイラは不可解なエラーメッセージを出します
高度にテンプレート化されたコードの使用/デバッグが難しい場合があります
少なくとも1つの構文上の癖があります(>>演算子はテンプレートに干渉する可能性があります)
C++の解析を非常に困難にするのに役立ちます
全体として、テンプレートをいつ使用するかについては慎重に検討する必要があります。
私の2c はかなり否定的です。
C++タイプは、コンパイル時の計算を実行するようには設計されていません。型を使用して計算の目標を達成するという概念は、明らかにハックです。さらに、求められることはなく、つまずいたものです。
..
コードでMPを使用することの見返りは、難しいなぞなぞを解いたことの満足の瞬間です。100行で、他の方法では200を要したことを実行しました。理解できないエラーメッセージを処理しました。 youがコードを新しいケースに拡張する必要がある場合、オーバーロードする正確な3行のテンプレート関数がわかるようになります。もちろん、メンテナは同じことを達成するために無限に多くの投資をしなければならないでしょう。
良い点:強力です。次のことが可能になります。
悪い点:強力。次のことが可能になります。
テンプレートは、実行可能なデザインスペースを大幅に増やします。これは必ずしも悪いことではありませんが、テンプレートをうまく使用するのがはるかに難しくなります。テンプレートコードには、言語機能だけでなく、言語機能の設計上の影響も理解しているメンテナが必要です。実際には、これは、多くの開発者グループが、C++テンプレートの最も単純で最も制度化されたアプリケーション以外のすべてを回避することを意味します。
一般に、テンプレートは言語をはるかに複雑にします(そして正しく実装するのが難しくなります!)。テンプレートは意図的にチューリング完全になるように設計されていませんが、とにかくそうです-したがって、テンプレートはほぼ何でもできますが、テンプレートを使用すると、その価値よりも厄介になる可能性があります。
テンプレートは慎重に使用する必要があります。
「デバッグがひどい」と「読みにくい」は、優れた抽象化を伴う優れたテンプレートの使用に対する優れた議論ではありません。
より良い否定的な議論は、STLには多くの「落とし穴」があるという事実に向けられ、STLがすでにカバーしている目的のためにテンプレートを使用することは車輪の再発明です。テンプレートはまた、リンク時間を増加させます。これは、一部のプロジェクトで懸念される可能性があり、構文に多くの特異性があり、人々にとって難解な場合があります。
しかし、ジェネリックコードの再利用、型の特性、リフレクション、スマートポインター、さらにはメタプログラムでさえ、多くの場合、欠点を上回ります。確認する必要があるのは、テンプレートが常に使用されることです慎重におよび控えめに。これらはすべての場合に最適なソリューションではなく、2番目または3番目に最適なソリューションでさえないことがよくあります。
すべての落とし穴を回避し、テンプレートが支援以上に物事を複雑にするときのための優れたレーダーを持つことができるように、それらを書くのに十分な経験を持つ人々が必要です。
私がまだ言及していない欠点の1つは、通常のクラスとクラステンプレートのインスタンス化の間の微妙なセマンティックの違いです。私は考えることができます:
typedef
ed型名は、テンプレートクラスに継承されません。typename
およびtemplate
キーワードを適切な場所に振りかける必要があります。virtual
にすることはできません。これらのことは通常克服することができますが、それらは苦痛です。
一部の人々はテンプレートを嫌います(私はそうします):
私にとって、テンプレートは、手榴弾を発射することもできる火炎放射器が統合されたチェーンソーのようなものです。私の人生のある時、私はそれを特別に必要とするかもしれません。しかし、ほとんどの場合、私は通常のハンマーと簡単なのこぎりを使って物を作り、そのようにしてかなり良い仕事をしています。
読みづらいのがわかりません。何が読めないのか
vector <string> names;
例えば?何に置き換えますか?
利点:汎用データ型を作成できます。
短所:コードの膨張