問題タブ [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.

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

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 に与える」。

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

c++ - ベクトルが特定の長さの場合、C++11 std::enable_if を使用してメンバー関数を有効にする

私は単純なベクトル クラスを作成しており、特定の長さのベクトルでのみ使用できるメンバー関数をいくつか用意したいと考えています (たとえば、3 要素ベクトルの外積)。私は std::enable_if に出くわしました。それは私がやりたいことができるように見えますが、正しく動作させることができないようです。

上記のコードは正しくコンパイルおよび実行されますが、の宣言のコメントを外すと、Vector<double,4> v4コンパイル時に次のエラーが発生します。

誰かが私が間違っている場所を指摘できますか?

0 投票する
5 に答える
24756 参照

c++ - enable_ifでエラーをコンパイルする理由

なぜこれはgcc48とclang32でコンパイルされないのですか?

GCCエラー:

CLANGエラー:

編集-ソリューション

Charles Salviaからの回答を受け入れましたが、実際的な理由から、提案された回避策(Nに特化)を使用できませんでした。私は私のために働く他の回避策を見つけました。依存enable_ifさせるT

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

c++ - 関数シグネチャで std::enable_if を避けるべき理由

Scott Meyersは、彼の次の本 EC++11 の内容とステータスを投稿しました。彼は、本の 1 つの項目が「関数シグネチャで回避する」std::enable_ifである可能性があると書いています。

std::enable_if関数の引数、戻り値の型、またはクラス テンプレートまたは関数テンプレート パラメーターとして使用して、関数またはクラスをオーバーロードの解決から条件付きで削除できます。

この質問では、3 つのソリューションすべてが示されています。

関数パラメータとして:

テンプレート パラメータとして:

戻り型として:

  • どのソリューションを優先する必要があり、他のソリューションを避ける必要があるのはなぜですか?
  • 「関数シグネチャでの回避std::enable_if」が戻り値の型 (通常の関数シグネチャの一部ではなく、テンプレートの特殊化の一部である) としての使用に関係するのはどの場合ですか?
  • メンバー関数テンプレートと非メンバー関数テンプレートに違いはありますか?
0 投票する
1 に答える
588 参照

c++ - enable_if +タイプテンプレート、SFINAEなし(ブーストなしのenable_if_c?)

いろいろな投稿を読んで、以下はコンパイルされないはずだと理解しています。

それでも、clang 3.2はこのコードバージョンを受け入れ、正常に動作します。私の理解では、内部バージョンのenable_if_cを内部で使用しています。今、私はそれを受け入れないgccの下でこれをコンパイルしたいと思います。他の投稿と同じように、実際のタイプを用意してSFINAEを使用するとよいと思います。

私の場合:

  • 演算子を定義しようとしているので、デフォルトの型/値を持つ追加のパラメーターをいじくり回すことができません->SFINAEを使用できないようです。
  • すべてをconstexprに保持する必要があるため、継承も使用できません。
  • プロジェクト要件のため、コード(enable_if_c)にブーストインクルードを使用できません

抜け道はありますか?

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

c++ - Container :: reserved()の正しい署名/存在の検出

STL準拠のコンテナであるタイプの場合、メンバー関数が含まれているCかどうかを正しく検出するにはどうすればよいですか?私は次のアプローチを試しました(GCC 4.6.3で):Creserve

これは、であるために機能しますCstd::vector、順序付けされていないコンテナでは機能しませんstd::unordered_set。その理由は、これreserveはの(直接)メンバー関数ですstd::vectorが、順序付けされていないコンテナの場合、基本クラスから継承されます。つまり、そのシグネチャはvoid (C::*)( typename C::size_type )void (B::*)( typename C::size_type )の一部の不特定の基本クラスBの署名ではありませんC

私はそれを回避し、reserve継承されたとしても検出する方法を知っていますが、それは不器用に見え、標準で何が許可されているのだろうかと思います。それで...

私の質問は次のとおりです。標準はreserve、指定されていない基本クラスから継承することを許可しますか、それとも概要をバインドし、直接メンバー関数を必要としますか?

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

c++ - enable_if boost::fusion呼び出し可能

特にboost::fusion呼び出し可能オブジェクトのためにenable_ifを使用する方法はありますか?

ここで、Fは融合です。「融合関数」はパラメータとして任意のシーケンスを取ることができます

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

c++ - 型のリストではなく、テンプレート パラメーター リストに std::tuple を使用する

次のようなテンプレート化された関数を呼び出そうとしています:

タプルの型を「単純に」渡すことができることはわかっています。これは私が知っていることですが、この関数を何度も呼び出し、タプルが非常に長いため、非常に面倒です。

だから私は get メソッドの複数の実装を試みましたが、成功しませんでした:

テンプレート パラメーターによる有効化

これは私にこのエラーを与えます:

テンプレート パラメータが欠落している理由がわかりません。

だから私は別の実装を試しました:

テンプレート - テンプレートという名前のパラメーター

しかし、私はこのエラーが発生します:

繰り返しますが、識別子の欠落によるエラーがわかりません。

私が達成したいことが可能であるかどうか、私は今疑問に思っています。好きなように使えstd::tupleますか?それとももっと良い方法がありますか?