問題タブ [sfinae]

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 に答える
798 参照

c++ - Test for existence of std::ostream operator<< via SFINAE GCC bug?

I decided to try my own hand at a bit of Substitution Failure Is Not A Error (SFINAE) code to test if the global operator<< is defined for a custom type.

The Stack Overflow question SFINAE + sizeof = detect if expression compiles already addresses testing for operator << through SFINAE, but my code is slightly different and is producing a puzzling result.

Specifically, my test code below won't even compile if I try to define operator<< for my custom type (struct A) after the test_ostr SFINAE template code -- but, from my understanding it should work fine since it's defined before any actual instantiation of the test_ostr class.

OTOH, it will compile if I define a operator<< for a different class that is not even instantiated or defined. But, then the test_ostr code fails to correctly find operator<<.

This code compiles and runs in GCC 4.4.3:

Output showing the bugs:

Are these compiler bugs? Am I missing something? Are the results different with a different compiler?

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

c++ - SFINAEコンテキストで、あいまいなメンバー要求エラーとメンバーが存在しないエラーを区別しますか?

編集:私自身の回答を投稿し、元の受け入れられた回答を保持しました...エイリアスについて考えさせられました。

編集:私の質問は、SFINAE(または他の)コンテキストでのメンバーvar/funcの存在とあいまいさを区別する可能性に向けられています。私の質問は、has_memberテンプレートを作成する方法ではなく、あいまいさと存在の違いを検出することです。

メンバーがあいまいな方法でアクセスされている場合(派生クラスの両方のベースにメンバーがある場合)と、メンバーがまったく存在しない場合(派生クラスのどちらのベースにもメンバーがない場合)を区別する部分的な特殊化を設定することは可能ですか? ?あいまいさが検出された場合にのみtrueを返す必要がありますが、メンバーがまったくない場合、またはメンバーが1つのクラスにのみ存在する場合は返しません。これは私がこれまでに持っているものであり、あいまいさ(私が欲しいもの)に対してtrueを返し、メンバーを持つ1つのクラス(私が望むもの)に対してのみfalseを返しますが、どちらのクラスにもメンバーがない場合はtrueを返します(argh!)

望ましい使用法:

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

c++ - タイプ名C++エラー

この非常に漠然としたタイトルで申し訳ありませんが、説明するのは非常に難しいです。

私が立ち往生しているエラーはこれです、私はそれが何を意味するのか分かりません:

carray.h:176:エラー:'typename Carray <T、Allocator> :: is_iterator' names'template <class T、class Allocator> template <class I、bool check> struct Carray <T、Allocator> :: is_iterator'、タイプではありません

何かがイテレーターであるかどうかを検出し、正しいオーバーロードを使用するためのこのスニペットがあります(http://stackoverflow.com/questions/6050441/why-does-this-constructor-overload-resolve-incorrectly)。これはコンパイルします:

ここで、実装を宣言から分離したかったので、これを試しましたが、エラーが発生しました。

g++4.5.5を使用しています。

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

c++ - 元のソース行がコンパイルに失敗した場合、テンプレートに別のソース行を選択させることは可能ですか?

私は比較的一般的なものを探しています:

  1. このコード行をコンパイルしてみてください
  2. それが成功した場合は、そのコード行をコンパイルして使用します。さもないと
  3. 他のコード行を使用する

double提供されたファンクターがsで有効かどうかに基づいて、何かを選択的にコンパイルしたい場合があります。

これまで SFINAE を使用したことはありませんが、これが最初の試みでした。

最初のオーバーロード (double を渡した場合により良いオーバーロードであるため選択される) で置換が失敗し、その制御が 2 番目のオーバーロードに進むと考えました。ただし、とにかく全体がコンパイルに失敗します。

私がやろうとしていることは合理的または可能ですか?

0 投票する
13 に答える
23110 参照

c++ - operator ==が存在するかどうかを確認する方法は?

operator==(メンバーまたは非メンバー関数)の存在をチェックする例を作成しようとしています。クラスにメンバーがあるかどうかを確認するのoperator==は簡単ですが、非メンバーがあるかどうかを確認するにはどうすればよいoperator==ですか?

これは私がこれまでにやらなければならないことです:

非メンバーの存在をテストするテスト関数を書くことは可能operator==ですか?はいの場合、どのように?

ところで、私は同様の質問をチェックしましたが、適切な解決策が見つかりませんでした:
SFINAE /テンプレートを使用してオペレーターが存在するかどうかをチェックすることは可能ですか?

これは私が試したものです:

ただし、非メンバーのoperator ==が削除されると、コンパイルは失敗します

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

c++ - クラスにサブクラス/タイプが含まれているかどうかを判断するにはどうすればよいですか?

クラスに特定のサブクラス/タイプがある場合、SFINAEのトリックを知ってもらうことはできますか?何かのようなもの、

次に例を示します。

私はいくつかのトリックを試しましたが、ほとんどの場合、予想されるコンパイラエラーで不十分でした。使用法:

編集my_type: 2番目のパラメータとしてに渡すことは不可能のようであるため、質問を再編集しましたhas_inner_type。したがって、現時点で問題となるのは、特定のタイプのみを検索することmy_typeです。私はこのコードを試しましたが、機能しません。

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

c++ - クラスメンバーポインタに対して試行したときに、SFINAEトリックが非クラス型に対して機能しないのはなぜですか?

好奇心を持って、私はトリックを使用してis_classコンストラクトの代替実装を試みていましたsizeof()。コードは次のとおりです。

問題は、インスタンス化するis_class<int>と、コンパイルエラーが発生することです。

さて、私の質問は、(またはなど)にint T::*適用できない場合、なぜ置換が失敗しないのかということです。コンパイラは?を選択すべきではありません。intvoid*yes checkno check

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

c++ - SFINAE が機能するはずの場所でコンパイラ エラーが発生するのはなぜですか?

指定されたポインタ型がそうであるかどうかを確認するメタプログラムを実装しようとしてconstいました。すなわち

  • is_const<TYPE*>::valueする必要がありますfalse
  • is_const<const TYPE*>::valueする必要がありますtrue

コードは次のとおりです。

また、コンパイラ エラー メッセージは次のとおりです。

私の焦点はエラーメッセージに移りました。最後の行が表示された場合:

実際に置換するT = int*TYPE = int*、適切な関数 ( ) と一致するはずchar check()です。ここで何がうまくいかないのか知りたいと思っています。

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

c++ - 置換の失敗はエラーではありません (SFINAE) static_cast を使用した質問

与えられた:

私が試してみると:

コードパッドは静的キャストでエラーを出します:

Hokey::render一致するものはないと言うべきようです。

もちろん、有効なオーバーロードを指定すれば、すべてが機能します。しかし、以下のコードを考えると、行のコメントを外すと、codepad が再びチョークします。

SFINAEは、最初のケースでは、render 内の問題はエラーではなく、動作する render がないことがエラーであるべきだと言っているのではありませんか?

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

c++ - C1001: コンパイラで内部エラーが発生しました

これは一目瞭然です。ディストリビューション ソートを実装しようとしていますが、MSVC コンパイラがクラッシュします。メンバー関数を検出するために SFINAE を使用するのは特定のケースのようです。関数に indexert を渡さない場合や、has_get_index を置き換えない場合、これは発生しないようです。また、残りのインデクサー オーバーロードのいずれかを削除しても発生しません。sortable にgetIndex() constメンバーがある場合、問題は残ります。

(「上記の場所」はありません) 最小限のテスト ケースは次のとおりです。