問題タブ [enable-if]
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++ - オプションで、テンプレートの initializer_list 構築をサポート
標準コンテナーをラップするテンプレートがある場合、initializer_list コンストラクターをかなり簡単に委任できるようです。
たとえば、これは std::vector でうまく機能します。
しかし、「int」としての T や、ネストされた value_type typedef を持たないその他の型では、明らかに機能しません。したがって、ある種の enable_if または同様のトリックを使用して、T がネストされた value_type typedef を定義し、std::initializer_list から構築可能でない限り、initializer_list コンストラクターを発行しないようにしたいと思います。
私は次のことを試しましたが、T が int の場合、コンパイラ (私の場合は clang++ 3.1) が無効な T::value_type を引き続きトリップするため、まだ機能しません。
概念を表現する方法に関する考えは、「T に value_type typedef があり、T::value_type の initializer_list から構築できる場合にのみ、T の value_type に対する初期化子リスト コンストラクターを T に与える」。
c++ - ベクトルが特定の長さの場合、C++11 std::enable_if を使用してメンバー関数を有効にする
私は単純なベクトル クラスを作成しており、特定の長さのベクトルでのみ使用できるメンバー関数をいくつか用意したいと考えています (たとえば、3 要素ベクトルの外積)。私は std::enable_if に出くわしました。それは私がやりたいことができるように見えますが、正しく動作させることができないようです。
上記のコードは正しくコンパイルおよび実行されますが、の宣言のコメントを外すと、Vector<double,4> v4
コンパイル時に次のエラーが発生します。
誰かが私が間違っている場所を指摘できますか?
c++ - enable_ifでエラーをコンパイルする理由
なぜこれはgcc48とclang32でコンパイルされないのですか?
GCCエラー:
CLANGエラー:
編集-ソリューション
Charles Salviaからの回答を受け入れましたが、実際的な理由から、提案された回避策(Nに特化)を使用できませんでした。私は私のために働く他の回避策を見つけました。依存enable_if
させるT
:
c++ - 関数シグネチャで std::enable_if を避けるべき理由
Scott Meyersは、彼の次の本 EC++11 の内容とステータスを投稿しました。彼は、本の 1 つの項目が「関数シグネチャで回避する」std::enable_if
である可能性があると書いています。
std::enable_if
関数の引数、戻り値の型、またはクラス テンプレートまたは関数テンプレート パラメーターとして使用して、関数またはクラスをオーバーロードの解決から条件付きで削除できます。
この質問では、3 つのソリューションすべてが示されています。
関数パラメータとして:
テンプレート パラメータとして:
戻り型として:
- どのソリューションを優先する必要があり、他のソリューションを避ける必要があるのはなぜですか?
- 「関数シグネチャでの回避
std::enable_if
」が戻り値の型 (通常の関数シグネチャの一部ではなく、テンプレートの特殊化の一部である) としての使用に関係するのはどの場合ですか? - メンバー関数テンプレートと非メンバー関数テンプレートに違いはありますか?
c++ - enable_if +タイプテンプレート、SFINAEなし(ブーストなしのenable_if_c?)
いろいろな投稿を読んで、以下はコンパイルされないはずだと理解しています。
それでも、clang 3.2はこのコードバージョンを受け入れ、正常に動作します。私の理解では、内部バージョンのenable_if_cを内部で使用しています。今、私はそれを受け入れないgccの下でこれをコンパイルしたいと思います。他の投稿と同じように、実際のタイプを用意してSFINAEを使用するとよいと思います。
私の場合:
- 演算子を定義しようとしているので、デフォルトの型/値を持つ追加のパラメーターをいじくり回すことができません->SFINAEを使用できないようです。
- すべてをconstexprに保持する必要があるため、継承も使用できません。
- プロジェクト要件のため、コード(enable_if_c)にブーストインクルードを使用できません
抜け道はありますか?
c++ - Container :: reserved()の正しい署名/存在の検出
STL準拠のコンテナであるタイプの場合、メンバー関数が含まれているC
かどうかを正しく検出するにはどうすればよいですか?私は次のアプローチを試しました(GCC 4.6.3で):C
reserve
これは、であるために機能しますC
がstd::vector
、順序付けされていないコンテナでは機能しませんstd::unordered_set
。その理由は、これreserve
はの(直接)メンバー関数ですstd::vector
が、順序付けされていないコンテナの場合、基本クラスから継承されます。つまり、そのシグネチャはvoid (C::*)( typename C::size_type )
、void (B::*)( typename C::size_type )
の一部の不特定の基本クラスB
の署名ではありませんC
。
私はそれを回避し、reserve
継承されたとしても検出する方法を知っていますが、それは不器用に見え、標準で何が許可されているのだろうかと思います。それで...
私の質問は次のとおりです。標準はreserve
、指定されていない基本クラスから継承することを許可しますか、それとも概要をバインドし、直接メンバー関数を必要としますか?
c++ - enable_if boost::fusion呼び出し可能
特にboost::fusion呼び出し可能オブジェクトのためにenable_ifを使用する方法はありますか?
ここで、Fは融合です。「融合関数」はパラメータとして任意のシーケンスを取ることができます
c++ - 型のリストではなく、テンプレート パラメーター リストに std::tuple を使用する
次のようなテンプレート化された関数を呼び出そうとしています:
タプルの型を「単純に」渡すことができることはわかっています。これは私が知っていることですが、この関数を何度も呼び出し、タプルが非常に長いため、非常に面倒です。
だから私は get メソッドの複数の実装を試みましたが、成功しませんでした:
テンプレート パラメーターによる有効化
これは私にこのエラーを与えます:
テンプレート パラメータが欠落している理由がわかりません。
だから私は別の実装を試しました:
テンプレート - テンプレートという名前のパラメーター
しかし、私はこのエラーが発生します:
繰り返しますが、識別子の欠落によるエラーがわかりません。
私が達成したいことが可能であるかどうか、私は今疑問に思っています。好きなように使えstd::tuple
ますか?それとももっと良い方法がありますか?