CRTPは多く使用されていますか?そして、なぜそうなのか?[閉まっている]


11

不思議なことに繰り返し発生するテンプレートパターンについて考えています

私はそれが非常に便利だと思うし、多くのタスクに対してかなりうまく調整できる。しかし、私は認めなければなりません、私は野生でCRTPコードの多くを見ません。

把握するのは難しいですか?仮想機能は全体的に簡単ですか?仮想キーワードが表示されるケースの90%で使用すべきではありませんか?

回答:


8

単純な事実は、ほとんどではないにせよ、多くのC ++ユーザーがvectormallocおよびを上回ることをほとんど把握できないことです。そのfreeため、高度なテンプレートメタプログラミングを評価するだけでなく実装できる数はそれほど多くありません。これは、たとえそれが90%の状況に適していたとしても、人々がそれやその使用方法を知らないという理由だけで、はるかに少なく見えることを意味します。

ただし、仮想関数に利点があります。つまり、仮想関数はCRTPよりも使いやすいです。C ++テンプレートは、事実上すべてのものについて意地が悪いことで有名であり、包含モデルはボールを吸います。

ただし、[仮想関数]は明らかに遅く、強力ではありません。たとえば、私は現在、CRTPを使用してコードを記述しています。CRTPでは、式テンプレートで使用する演算子オーバーロードを継承します。仮想関数がそれを機能させる方法はありません。


1
CRTPが「仮想」の使用を回避するために使用する言語機能が、「仮想的に」何かやすべてについて意地悪であることは、皮肉ではありませんか?
カイゼルディ

6

WTLはCRTPを使用します。Chromiumブラウザは、WTLを使用するソフトウェアのよく知られた例であるため、「野生で」使用されていると思います。

約90%ですか?それは間違いなく誇張です。ポリモーフィックオブジェクトのコンテナを使用したことがありますか?それは、多型の非常に一般的な使用法だとするので、あなたはCRTPでそれを行うことができないBase<DerivedA>と同じではありませんBase<DerivedB>


-5

広く使用されない理由は次のとおりです。

  1. ハックです
  2. ハックとして、あなたがそれを使用するとき、あなたが問題に遭遇しないことを保証しません。通常のオブジェクト指向のものは多数のプロジェクトで使用されており、適切に動作することがわかっています/問題はよく知られています。CRTPは少数のプロジェクトでのみ見つかり、データは利用できません。
  3. それを使用する正当な理由はありません-サイトに登録されているほとんどの理由は無効です
  4. いくつかのことがより複雑になる可能性があります

11
ハッキングではありません。動作は非常に明確に定義されており、十分に使用されています。
DeadMG

5
はい、STL全体が大きなハックです。
アビックス

あなたの答えを編集して説明することができます、なぜそれがハックですか?
ニック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.