問題タブ [crtp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
793 参照

c++ - コピー アンド スワップ イディオムの再利用

コピーアンドスワップのイディオムを再利用可能なミックスインに入れようとしています:

CRTP経由で混合するつもりです:

ただし、簡単なテストでは、機能していないことが示されています。

これは「デフォルト」を 2 回出力するだけで、「コピー」も「スワップ」も出力されません。ここで何が欠けていますか?

0 投票する
3 に答える
314 参照

c++ - typedef での CRTP 関連のコンパイラ エラー

CRTPについてかなり単純な質問があると思いますが、答えが見つからないようです。おそらく、あまりにも単純なため、誰も質問しようとは思いませんでした。私はコンセプトに慣れていないので、あまり笑わないでください;)。

コードは次のとおりです (STL コンテナーに似たようなことをしようとする試みのようなものです)。

問題をコメントすると、すべてがコンパイルされますtypedef typename _THelpee::T Th;。そして、それは私を混乱させます:コンパイラが好きではない場合typedef typename _THelpee::T Th;、なぜそれは通過するのstatic_cast< _THelpee* > ( this )->mValですか? THelperインスタンス化するときにインスタンス化できないことと関係があると思いますTDerivedが、明確な理解はありません。誰か、ここで何が起こっているかについて簡単な説明や参考文献を教えてください。ありがとうございました。

編集: '_T' プレフィックスを削除しました。

0 投票する
2 に答える
1597 参照

c++ - CRTPされたコンテナ

私はいくつかのテンプレートプログラミングで歯を食いしばっています、そして私はこれに非常に新しいです。実装したいのは、STLコンテナを含むいくつかのCRTPクラスです。CRTPスタイルに従ってコンパイル時にとが「派生」する(コンパイル時の)基本クラスのclass A{};例として使用してみましょう。class B{};class C{};

これで、との両方BCコンテナが含まれます。例の目的のために、それをそれぞれastd::vectorとaとしstd::setます。begin()ここで、これらのイテレータをaとend()、フォワードイテレータを公開する関数を介して公開したいと思います。ただし、内部にある正確なコンテナを公開したくないのでBCこれらの関数をに定義しAて、呼び出し時に正しいものをB使用できるようにしCます。

これは可能ですか?今のところ、私の計画は、のIterator内部クラスを持ち、BそれにC実際のイテレータ(場合によってはベクトルまたはセット)を含み、それに呼び出しを委任することです。ただし、これは複製されたグルーコードが多いようで、より良いオプションがあると思います。

いくつか質問があります。

  1. Aで内側の留め金を宣言して、 CRTPBでうまく機能するようにするにはどうすればよいですかCA、、のためにそれを複製する必要がBありCますか?で空のクラスにすることはできますか?また、特殊な実装でAそれらをマスクしますか?BC

  2. 接着剤と重複を減らしてイテレータを公開するにはどうすればよいですか?

boostのような外部ライブラリとの依存関係を作成したくないので、stdのみに固執したいと思います。ですから、自分で必要なものは何でも実装する必要があります。すべての助けをありがとう。

0 投票する
1 に答える
738 参照

c++ - CRTP と「派生」での関数の直接実装

CRTPの理解を深めようとしています。これまでのところ、次のような関数を書くことができるというのが私の理解です。

xここで、 function に渡される実際のコンパイル時の派生オブジェクトに応じて、foo()さまざまなことを行います。

ただし、クラスを派生DerivedBasedo_stuff()、非仮想であるがオーバーライドされDerived::do_stuffた . したがって、CRTPを使用するのが正確な場合は、シャドーイング/マスキングに対するCRTPの利点を示す最も単純で重要な例です。

0 投票する
2 に答える
139 参照

c++ - コンパイル時または実行時に非仮想オーバーライドを検出する方法

関数が派生クラスで(静的に)オーバーライドされたかどうかを検出したい:

明らかに、オーバーライドがない場合は「func」を呼び出しません。私は自分の質問に直接答えることを好みます。過負荷を判断するために実際の問題について説明します。また、一般的な問題に取り組む他の方法を示す回答をいただければ幸いです。

さて、それはコンパイルされます、私はまだ私の実際のコードとの違いを見つけていません、それはそうではありませんでした。ちなみに、私の実際のコードでは、関数の呼び出しを避けようとしているだけでなく、さらにいくつかあります。関数がオーバーライドされているのか、それともまったく別の方法を使用する必要があるのか​​を本当に知りたいです。

0 投票する
4 に答える
749 参照

c++ - 複数のテンプレート パラメータで CRTP を使用する場合、テンプレートのデフォルト値を宣言する方法は?

私はやってみたいです:

しかし、明らかにBattleData宣言されていないので、前方宣言を試みました:

しかし、私は得る

エラー: 「BattleData の 2 行目のテンプレート パラメーターの番号が間違っています。

私は本当にこれに対する解決策を見ることができません!

編集

私がこれを行っている理由は、BattleDataとして直接使用できるようにしたいclassからですが、それをサブクラス化できるようにしたいためです。その場合、派生classを 2 番目のtemplateパラメーターとして指定する必要があります。

たとえば、私のBattleDataクラスのコーパスが次のようになっているとしましょう:

そして、私はサブクラスを持っています

場合によっては、次のようなコードを記述できるようにしたいと思います。

デフォルトの引数を使用できなければ、次のことさえできません。

一方では、関数が BattleData クラスで仮想化されていない理由は、仮想関数がないことの利点です。私にとってうまくいかないもう1つの理由は、親CRTPクラスの1つが派生型に存在する場合にのみ関数を呼び出し(decltype(Derived::function)構造体を使用してenable-ifのように)、それ以外の場合はデフォルトの動作にフォールバックすることです。特定の設計パターンを持つこれらの関数が大量に存在する可能性があるため (多くの異なるケースを持つプロトコルを読み取り、派生クラスが対応する関数を指定する場合にのみ特定の方法でケースを処理する CRTP のように、それ以外の場合は処理せずに転送するだけです) )。

したがって、これらの関数は に存在しても存在しなくてもかまいSubBattleDataませんBattleDataが、両方のクラスはインスタンス化されていれば問題なく動作しますが、インスタンス化することは不可能BattleDataです。

0 投票する
1 に答える
476 参照

c++ - 不思議なことに繰り返されるテンプレート パターンを持つ配列?

Windows 用の CRTP ベースのラッパーがありますHANDLE

私が抱えている問題は、???上記の代わりに何をすべきかわからないことです。とは言えませんHandleT<T>。配列に収まらないさまざまな種類のハンドルになる可能性があるためです。とは言いたくありませんHANDLE。その場合、関数はHandleTオブジェクトに対してまったく機能しないためです。ユーザーは、ラッパーを完全に呼び出すことを避けた方がよいでしょう。また、私はまだ C++0x 以前の世界にいるので、可変個引数テンプレートを使用できません。

この問題に対する既知の解決策はありますか、それとも上記の理想的でない解決策を使用する必要がありますか?

0 投票する
1 に答える
125 参照

c++ - ミックスイン(?)を使用してストリームi/oを簡単にする

私が一般的なコードで作業している多くの学生は、適切なストリーム演算子のオーバーロードを理解するのに問題があるため、コードを容易にし、正しい演算子の実装を保証するために、ヘルパーテンプレート(これが実際のミックスインであるかどうかはわかりません)を作成しようとしました。ここに来る:

クラスの継承:

私が現時点で見ている限り、この実装の欠点は次のとおりです。

  • サードパーティタイプでは機能しません
  • すべてのユーザーが特定のタイプのIoを必要とするわけではありませんが、継承が含まれているため、IoClassとの緊密な結合が含まれます

アップ:

  • できます ;-)
  • 同様のストリームクラスは、すべてのクラスを変更せずに、すべてのクラスに特定の新しいコードを記述せずに追加できます。

私はミックスインの使用経験があまりなく、コーディングガイドラインに違反することがあるので、これがミックスインの適切な使用法であるかどうか、または他のより適切なものと同様の効果を得る方法を知りたいです技術。

どうもありがとう、マーティン

0 投票する
1 に答える
340 参照

c++ - パラメータ化された基本クラスを持つC++CRTP?

少しバリエーションのあるCRTPを使おうとしています。派生クラステンプレートが1つあり、これを複数の基本クラスに適用したいと考えています。しかし、これは不可能であるか、構文を正しく理解できないかのどちらかです。次のコードはコンパイルされませんが、うまくいけば、私が達成したいことを示しています。

これはできますか?

編集:

私はここで何を達成しようとしていますか?

上記のコードの一部の名前を「犬と猫」のメタファーを使用するように変更しました。次のような機能が存在する可能性があります。

ただしWrapper、犬と猫の両方に共通のコンストラクターと演算子が含まれます。基本クラスが特殊化されている一種の逆ポリモーフィズム。このようにする理由は、コンストラクターと演算子を専門分野ごとに書き直したり転送したりする必要がないようにするためです。

0 投票する
3 に答える
262 参照

c++ - テンプレート クラスでの CRTP の一致

最近、私はテンプレートをいじっていて、次の問題に遭遇しました。次のような CRTP パターンを実装しています。

class protocol_object非 CRTP タイプを受け入れながら、メンバー テンプレート関数内の のインスタンスを一致させたいと思います。

残念ながら、これまでに呼び出されたのは 2 番目のバージョンだけです。明らかmatch(protocol_object<derived_t> &value)に、より一般的な形式を支持して考慮または拒否されていませんmatch(T &value)

これから抜け出す方法はありますか?

ヒントをありがとう。アルネ