問題タブ [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.
c++ - テンプレート化された親から子typedefにアクセスする
以下がコンパイルされないのはなぜですか?
どうしてBase
その子のタイプにアクセスできないのですか?typedefの代わりに静的関数で同じことを試しましたが、それは問題なく機能します。
GCC4.4.2とclang3.0の両方を試しました。
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.
c++ - 名前空間内の CRTP vs typdefs とその仲間
私は一晩中コンパイラと戦いましたが、アイデアが尽きてしまいました...
保護された機能を持つ名前空間内に CRTP 構造があります。派生クラス (同じくその名前空間内) は、別の名前に型定義されています。
その隣には、その関数を呼び出そうとする静的関数を持つクラス (別の名前に型定義されています) があります。だから私は友達を作り始めますが、それでもコンパイラ(私の場合はVS 2010)は関数へのアクセスを許可しません。
一部のコードはおそらくより明確です。
ここに表示されていないものと、これを解決する方法を誰か教えてもらえますか?
乾杯
c++ - 静的ポリモーフィズムを使用するためのC++階層の変換
私は次のクラス階層を持っています(実際にはもっとたくさんのクラスがあります)、静的ポリモーフィズムを利用するために次を再編成することは可能かどうか疑問に思いましたか?
大量のプロファイリングを行った後、仮想メソッド呼び出しによるオーバーヘッドは実際には非常に大きく、可能な限り最適化することを望んでいたので、私は尋ねます。
c++ - CRTP:式テンプレートに関するコンパイラ依存の問題
次のコード(crtp.ccに格納されている)でコンパイラに依存する問題が発生しました:
実際、私がそれをコンパイルするとき:
私が得る:
これは予想される動作です。icpcを使用する場合:
代わりにを取得しSegmentation fault
ます。ランニング
ソースの29行目を指している
私はC++にまったく慣れておらず、結果が得られずにバグを探すのにかなりの時間を費やしたので、この問題が私が導入したエラーによるものかどうかを理解するために、より経験豊富な人の意見を聞きたいと思います。コンパイラのバグに。
編集:Mike Seymourからの回答の後、コードをそのまま変更しました。これでコンパイラの警告は表示されませんが、以前と同じ動作が得られます(同じvalgrind応答で)。誰かがIntelでコンパイルしようとしましたか?
編集:ウィキペディアの式テンプレートページでコードをコンパイルしようとしました。提供した例とまったく同じ動作が得られました。
編集:私は問題をさらに調査しました、そしてインテルと一緒にコンパイルすることicpc
はオペレーターのようです
再帰的に自分自身を呼び出します。私が見つけた回避策の1つは、この演算子をメソッドに置き換えることです。
それに応じて、さまざまなクラスのコンストラクターを変更します。誰かがこれらの2つの振る舞いのどちらが正しいのか、それを説明するための標準を指している可能性があるかを知ることができますか?
c++ - static_cast で実装された変換演算子
ここで提起した問題に続いて、この質問をします。
ポイントは至ってシンプルです。この種の 2 つのクラスがあるとします。
次に、次のような型変換があるとします。
問題は、この変換の標準準拠の動作はどうあるべきかということです。
と同じにする必要がありますか、const T & val(static_cast<const T &> (param) )
それともスタック オーバーフローまで再帰的に反復する必要がありますか? GNUg++
でコンパイルした最初の動作と Intel でコンパイルした 2 番目の動作が得られたことに注意してくださいicpc
。
私はすでに標準 (static_cast のセクション 5.9 と変換のセクション 12.3) をのぞき見しようとしましたが、経験不足のため、答えを見つけることができませんでした。
これを手伝ってくれる時間を割いてくれた人に、前もって感謝します。
c++ - final にする必要がある CRTP 中間クラス
CRTP クラスの継承チェーンがあります。CRTP クラスは、「最終的な」派生クラスがそれ自体を CRTP パラメータとして渡し、継承チェーンを完成させるまで、互いに派生します。
私がやりたいことは、テンプレートを含まない CRTP 継承チェーンの各レベルで、そのような「最終的な」エンドユーザー クラスを持つことができるようにすることです。
ご想像のとおり、この typedef は機能しません。定義されている独自の型を参照しているためです。問題は、これをどのように達成するかです。私が考えることができる方法は、次のとおりです。
コード内のコメントにあるように、これはあまり洗練されたソリューションではありません。コンストラクターを再定義して、基本コンストラクターに転送する必要があります。もっとエレガントな方法を知っている人はいますか?
c++ - 不思議なことに繰り返されるテンプレート - バリエーション
CRPに関して、(テンプレート テンプレート パラメータを使用して) わずかなバリエーションを実装したい場合、コンパイル エラーが発生します。
ただし、これを使用する代わりに、このフォームを選択するかどうかは正確にはわかりません (これは私のためにコンパイルされません) (これは機能します)。
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.