問題タブ [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 投票する
2 に答える
200 参照

c++ - テンプレート化された親から子typedefにアクセスする

以下がコンパイルされないのはなぜですか?

どうしてBaseその子のタイプにアクセスできないのですか?typedefの代わりに静的関数で同じことを試しましたが、それは問題なく機能します。

GCC4.4.2とclang3.0の両方を試しました。

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

c++ - Reference counting with a generic intrusive pointer client

Introduction

Peter Weinhart describes how to design a generic intrusive_ptr base class using CRTP, which may be used as follows:

This approach imposes the constraint that all foo objects carry a reference counter. Assume that we keep foo sometimes by value and only want to pay the price of the reference counter when we have a pointer. For example, sometimes we would like to create foo instances and just move them around, and sometimes we want to allocate foo on the heap.

Conceptually, the right mechanism for this scenario is a std::shared_ptr. However, there are certain scenarios requiring raw pointers that would call for an intrusive pointer, e.g., when passing pointers through a C API that take void pointers. In this case, one would "ref" the pointer before passing it to the opaque API and "unref" when getting it back.

Having control over foo, probably the best method would be to use a policy-based implementation and have a reference-counted and basic version of foo. Without having control over foo, an alternative design would to invert the inheritance relationship:

In the above mentioned article, Peter says that a such a "generic implementation of [intrusive] would make use of C++0x variadic templates and perfect forwarding."

Question

How would the implementation of such a generic intrusive class look like? I could see that it may benefit from C++11 inheriting constructors, but it is unclear to me how one would in fact implement the body of intrusive using the mentioned tools.

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

c++ - 名前空間内の CRTP vs typdefs とその仲間

私は一晩中コンパイラと戦いましたが、アイデアが尽きてしまいました...

保護された機能を持つ名前空間内に CRTP 構造があります。派生クラス (同じくその名前空間内) は、別の名前に型定義されています。

その隣には、その関数を呼び出そうとする静的関数を持つクラス (別の名前に型定義されています) があります。だから私は友達を作り始めますが、それでもコンパイラ(私の場合はVS 2010)は関数へのアクセスを許可しません。

一部のコードはおそらくより明確です。

ここに表示されていないものと、これを解決する方法を誰か教えてもらえますか?

乾杯

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

c++ - 静的ポリモーフィズムを使用するためのC++階層の変換

私は次のクラス階層を持っています(実際にはもっとたくさんのクラスがあります)、静的ポリモーフィズムを利用するために次を再編成することは可能かどうか疑問に思いましたか?

大量のプロファイリングを行った後、仮想メソッド呼び出しによるオーバーヘッドは実際には非常に大きく、可能な限り最適化することを望んでいたので、私は尋ねます。

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

c++ - CRTP:式テンプレートに関するコンパイラ依存の問題

次のコード(crtp.ccに格納されている)でコンパイラに依存する問題が発生しました:

実際、私がそれをコンパイルするとき:

私が得る:

これは予想される動作です。icpcを使用する場合:

代わりにを取得しSegmentation faultます。ランニング

ソースの29行目を指している

私はC++にまったく慣れておらず、結果が得られずにバグを探すのにかなりの時間を費やしたので、この問題が私が導入したエラーによるものかどうかを理解するために、より経験豊富な人の意見を聞きたいと思います。コンパイラのバグに。

編集:Mike Seymourからの回答の後、コードをそのまま変更しました。これでコンパイラの警告は表示されませんが、以前と同じ動作が得られます(同じvalgrind応答で)。誰かがIntelでコンパイルしようとしましたか?

編集:ウィキペディアの式テンプレートページでコードをコンパイルしようとしました。提供した例とまったく同じ動作が得られました。

編集:私は問題をさらに調査しました、そしてインテルと一緒にコンパイルすることicpcはオペレーターのようです

再帰的に自分自身を呼び出します。私が見つけた回避策の1つは、この演算子をメソッドに置き換えることです。

それに応じて、さまざまなクラスのコンストラクターを変更します。誰かがこれらの2つの振る舞いのどちらが正しいのか、それを説明するための標準を指している可能性があるかを知ることができますか?

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

c++ - static_cast で実装された変換演算子

ここで提起した問題に続いて、この質問をします。

ポイントは至ってシンプルです。この種の 2 つのクラスがあるとします。

次に、次のような型変換があるとします。

問題は、この変換の標準準拠の動作はどうあるべきかということです。

と同じにする必要がありますか、const T & val(static_cast<const T &> (param) ) それともスタック オーバーフローまで再帰的に反復する必要がありますか? GNUg++でコンパイルした最初の動作と Intel でコンパイルした 2 番目の動作が得られたことに注意してくださいicpc

私はすでに標準 (static_cast のセクション 5.9 と変換のセクション 12.3) をのぞき見しようとしましたが、経験不足のため、答えを見つけることができませんでした。

これを手伝ってくれる時間を割いてくれた人に、前もって感謝します。

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

c++ - final にする必要がある CRTP 中間クラス

CRTP クラスの継承チェーンがあります。CRTP クラスは、「最終的な」派生クラスがそれ自体を CRTP パラメータとして渡し、継承チェーンを完成させるまで、互いに派生します。

私がやりたいことは、テンプレートを含まない CRTP 継承チェーンの各レベルで、そのような「最終的な」エンドユーザー クラスを持つことができるようにすることです。

ご想像のとおり、この typedef は機能しません。定義されている独自の型を参照しているためです。問題は、これをどのように達成するかです。私が考えることができる方法は、次のとおりです。

コード内のコメントにあるように、これはあまり洗練されたソリューションではありません。コンストラクターを再定義して、基本コンストラクターに転送する必要があります。もっとエレガントな方法を知っている人はいますか?

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

c++ - 不思議なことに繰り返されるテンプレート - バリエーション

CRPに関して、(テンプレート テンプレート パラメータを使用して) わずかなバリエーションを実装したい場合、コンパイル エラーが発生します。

ただし、これを使用する代わりに、このフォームを選択するかどうかは正確にはわかりません (これは私のためにコンパイルされません) (これは機能します)。

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

c++ - Detecting siblings of a CRTP base class

I am trying to use boost::is_base_of in order to detect if a CRTP base class Generic can identify its peers i.e. classes that T is also derived from.

As shown in Generic<T>::init(), I would like to use these mechanisms in order to allow the class Generic<T> add pointers to functions one of its peers Bar1 or Bar2 (from which T also derives) to a map. Unfortunately boost::is_base_of is unable to detect classes, such as Bar3, that T does not derive from.

gcc error message:

Edit

To provide some context for this question. I'm trying to store pointers to the setValue methods of the base classes of each Foo<T> in a map for quick access. The choice of setValue to call depends on a string, thus the map. Another class X may inherit Bar1 and Bar3 but not Bar2, and as before I would have to store pointers to the appropriate setValue's for quick access. Generic<T> aims to fulfil this role for Foo, X etc.