web-dev-qa-db-ja.com

C ++テンプレートの長所と短所は何ですか?

私は友人と話していましたが、C++のテンプレートを使用することに完全に同意する人もいれば、まったく同意しない人もいます。

良い点のいくつかは次のとおりです。

  • それらはより安全に使用できます(型安全性)。
  • これらは、APIの一般化を行うための優れた方法です。

C++テンプレートについて他にどのような良い点を教えていただけますか?

C++テンプレートについてどのような悪い点を教えていただけますか?

編集:私がこれを求めている理由の1つは、私が試験のために勉強していて、現在C++テンプレートのトピックをカバーしているということです。だから私はそれらについてもう少し理解しようとしています。

26
fmsf

テンプレートは非常に強力なメカニズムであり、多くのことを簡素化できます。ただし、適切に使用するには、適切な使用方法を決定するために、多くの時間と経験が必要です。

私にとって最も重要な利点は次のとおりです。

  • コードの繰り返しを減らす(一般的なコンテナー、アルゴリズム)
  • 高度なコードの繰り返しを減らす(MPLとFusion)
  • 静的ポリモーフィズム(=パフォーマンス)およびその他のコンパイル時の計算
  • ポリシーベースの設計(柔軟性、再利用性、簡単な変更など)
  • コストをかけずに安全性を向上させる(つまり、ブーストユニットによる寸法分析、静的アサーション、コンセプトチェック)
  • 関数型プログラミング(Phoenix)、遅延評価、式テンプレート(C++でドメイン固有の組み込み言語を作成でき、優れたProtoライブラリがあり、Blitz ++があります)
  • 日常生活で使用されるその他のあまり目立たないツールやトリック:
    • STLとアルゴリズム(forfor_eachの違いは何ですか)
    • bind、lambda(またはPhoenix)(より明確なコードを記述し、物事を単純化する)
    • Boost関数(コールバックの記述を容易にします)
    • タプル(タプルを一般的にハッシュする方法は?たとえば、Fusionを使用してください...)
    • TBB(parallel_forおよびその他のSTLのようなアルゴリズムやコンテナー)
  • テンプレートなしのC++を想像できますか?はい、できます。初期の頃は、コンパイラの制限のためにそれらを使用できませんでした。
  • テンプレートなしでC++で記述しますか?いいえ、上記の利点の多くを失うためです。

欠点:

  • コンパイル時間(たとえば、Sprit、Phoenix、MPL、およびいくつかのFusionを投入すると、コーヒーを飲みに行くことができます)
  • 人々誰ができるかテンプレートを使用して理解することはそれほど一般的ではありません(そしてこれらの人々は役に立ちます)
  • 人々できると思う人テンプレートを使用して理解することは非常に一般的です(そしてこれらの人々はあなたのコードから地獄を作ることができるので危険です。しかし、いくつかの教育/メンタリングの後に彼らのほとんどは参加します前のポイントで述べたグループ)
  • テンプレートexportサポート(不足)
  • エラーメッセージはわかりにくいかもしれません(ある程度の学習の後、必要なものを見つけることができますが、それでも...)

次の本を強くお勧めします。

47
Anonymous

良い面として、C++テンプレート:

  • タイプの一般化を可能にする

  • 入力する必要のある冗長コードの量を減らします

  • タイプセーフなコードの作成を支援する

  • コンパイル時に評価されます

  • パフォーマンスを向上させることができます(ポリモーフィズムの代替として)

  • 非常に強力なライブラリの構築を支援する

マイナス面:

  • 注意しないとすぐに複雑になる可能性があります

  • ほとんどのコンパイラは不可解なエラーメッセージを出します

  • 高度にテンプレート化されたコードの使用/デバッグが難しい場合があります

  • 少なくとも1つの構文上の癖があります(>>演算子はテンプレートに干渉する可能性があります)

  • C++の解析を非常に困難にするのに役立ちます

全体として、テンプレートをいつ使用するかについては慎重に検討する必要があります。

15
Colin

私の2c はかなり否定的です。

C++タイプは、コンパイル時の計算を実行するようには設計されていません。型を使用して計算の目標を達成するという概念は、明らかにハックです。さらに、求められることはなく、つまずいたものです。

..

コードでMPを使用することの見返りは、難しいなぞなぞを解いたことの満足の瞬間です。100行で、他の方法では200を要したことを実行しました。理解できないエラーメッセージを処理しました。 youがコードを新しいケースに拡張する必要がある場合、オーバーロードする正確な3行のテンプレート関数がわかるようになります。もちろん、メンテナは同じことを達成するために無限に多くの投資をしなければならないでしょう。

6
Ofek Shilon

良い点:強力です。次のことが可能になります。

  • コンパイル時の属性と計算を規定する
  • 一般的なアルゴリズムとデータ構造を説明する
  • そうでなければ反復的で、退屈で、間違いを起こしやすい他の多くのことをします
  • マクロを使用せずに言語で実行します(これははるかに危険でわかりにくい場合があります!)

悪い点:強力。次のことが可能になります。

  • 冗長で、誤解を招き、曖昧なコンパイル時エラーを引き起こします(ただし、マクロほど曖昧で誤解を招くものではありません...)
  • あいまいで危険な誤設計を作成します(ただし、マクロほど簡単ではありません...)
  • 注意しないとコードの膨張を引き起こします(マクロのように!)

テンプレートは、実行可能なデザインスペースを大幅に増やします。これは必ずしも悪いことではありませんが、テンプレートをうまく使用するのがはるかに難しくなります。テンプレートコードには、言語機能だけでなく、言語機能の設計上​​の影響も理解しているメンテナが必要です。実際には、これは、多くの開発者グループが、C++テンプレートの最も単純で最も制度化されたアプリケーション以外のすべてを回避することを意味します。

一般に、テンプレートは言語をはるかに複雑にします(そして正しく実装するのが難しくなります!)。テンプレートは意図的にチューリング完全になるように設計されていませんが、とにかくそうです-したがって、テンプレートはほぼ何でもできますが、テンプレートを使用すると、その価値よりも厄介になる可能性があります。

4
comingstorm

テンプレートは慎重に使用する必要があります。

「デバッグがひどい」と「読みにくい」は、優れた抽象化を伴う優れたテンプレートの使用に対する優れた議論ではありません。

より良い否定的な議論は、STLには多くの「落とし穴」があるという事実に向けられ、STLがすでにカバーしている目的のためにテンプレートを使用することは車輪の再発明です。テンプレートはまた、リンク時間を増加させます。これは、一部のプロジェクトで懸念される可能性があり、構文に多くの特異性があり、人々にとって難解な場合があります。

しかし、ジェネリックコードの再利用、型の特性、リフレクション、スマートポインター、さらにはメタプログラムでさえ、多くの場合、欠点を上回ります。確認する必要があるのは、テンプレートが常に使用されることです慎重におよび控えめに。これらはすべての場合に最適なソリューションではなく、2番目または3番目に最適なソリューションでさえないことがよくあります。

すべての落とし穴を回避し、テンプレートが支援以上に物事を複雑にするときのための優れたレーダーを持つことができるように、それらを書くのに十分な経験を持つ人々が必要です。

2
Dan Olson

私がまだ言及していない欠点の1つは、通常のクラスとクラステンプレートのインスタンス化の間の微妙なセマンティックの違いです。私は考えることができます:

  1. 祖先型のtypedefed型名は、テンプレートクラスに継承されません。
  2. typenameおよびtemplateキーワードを適切な場所に振りかける必要があります。
  3. メンバー関数テンプレートをvirtualにすることはできません。

これらのことは通常克服することができますが、それらは苦痛です。

2
j_random_hacker

一部の人々はテンプレートを嫌います(私はそうします):

  • 保守性の視点では、テンプレートの誤った使用は、テンプレートがもたらすはずだった時間の最初の利点よりも10倍強い悪影響を与える可能性があります。
  • 最適化ハメ撮りでは、それらが許可するコンパイラーの最適化は、最適なアルゴリズムやマルチスレッドの使用と比較して何もありません。
  • タイムハメ撮りのコンパイル時に、テンプレートの誤った使用は、解析、コンパイル、およびリンクのフェーズに非常に悪影響を与える可能性があります。テンプレート化された宣言の記述が不十分な場合、各コンパイルユニットに無用な寄生虫宣言が大量に発生します(200行のコードで.objを生成する方法は次のとおりです)。 1Mbの)。

私にとって、テンプレートは、手榴弾を発射することもできる火炎放射器が統合されたチェーンソーのようなものです。私の人生のある時、私はそれを特別に必要とするかもしれません。しかし、ほとんどの場合、私は通常のハンマーと簡単なのこぎりを使って物を作り、そのようにしてかなり良い仕事をしています。

2
Alexis Pautrot

読みづらいのがわかりません。何が読めないのか

vector <string> names;

例えば?何に置き換えますか?

1
anon

利点:汎用データ型を作成できます。

短所:コードの膨張

0
Vinay