問題タブ [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.
c++ - 制御フロー ステートメントで SFINAE テストを使用できますか?
クラスに関数があるかどうかを確認するための SFINAE テストがあります。テストは正しく動作しますが、if ステートメントで使用しようとするとコンパイル エラーが発生します。
else 節が実行されているはずなのに、2 行目に「エラー: 'class Node' には 'setInstanceKey' という名前のメンバーがありません」というメッセージが表示されます。
これを機能させる方法はありますか?
ありがとう。
c++ - sfinae を使用して名前空間メンバーの存在をテストする
sfinae を使用して名前空間メンバーの存在をテストできるかどうかを調べようとしていました。Googleはそれについてかなり沈黙しています。次のコードを試しましたが、失敗します。
理由はありますか?
よろしく、
c++ - クラス テンプレートのメンバ関数宣言がすべて整形式でなければならないのはなぜですか?
テンプレート パラメーターに入れ子になった type/typedef XYZ があるかどうかを確認したいとします。
期待どおり、正常に動作します。
これを考慮してください:
hasXYZ<int>
コンパイル時エラーが発生するようになりました。OK、f はテンプレート関数ではありません。しかし一方で、hasXYZ
が int を介してインスタンス化されると、コンパイラは候補リストからhasXYZ<int>::value
簡単に除外できます。f(int::XYZ*)
クラス テンプレートのメンバー関数宣言のインスタンス化に失敗すると、クラスのインスタンス化全体が失敗する理由がわかりません。何か案は?
編集:私の質問は:なぜメンバー関数宣言はすべて整形式でなければならないのですか? コンパイラは使用時にのみメソッドをインスタンス化するため、正しい宣言が必要なのはなぜですか。この機能の使用例として、上記の例 2 を検討してください。
c++ - gcc での静的メンバー変数のコンパイル エラーの概念チェック
http://www.drdobbs.com/tools/227500449で説明されている手法を適用しようとしています
以下のサンプル コードでは、次の出力が期待されます。
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
そして、clang を使用してコンパイルすると、実際にこれが発生します。しかし、gcc では、このコードは次のエラーを返します。
gcc 4.5.1 を使用しています... gcc が正しい SFINAE ルールに従っていないように見えますが、100% 確実ではありません。clang は正しく、これは gcc のバグですか?
c++ - メソッドのコンパイル時のアサーション。まだ動作していません
テンプレート パラメーターがメソッド (またはその親クラスの 1 つ) を実装していることをテンプレート内でアサートする簡単な方法が必要です。私は概念チェックライブラリを読みましたが、このような単純なチェックを行う簡単な例を見つけるのは難しいです.
私は他の投稿(この投稿やこの投稿など)をフォローしようとしましたが、これを変更して、多くのメソッドタイプ(私の例ではFoo(メソッド名)とhas_foo(チェッカー名))で汎用的にできるようにしました。マクロ引数としてラップされるため、任意のメソッドに使用できます)
私が今持っているコードはこれです:
このサンプル コードをコンパイルすると (g++ 4.4.3 ubuntu で -std=c++0x オプションを指定すると、static_assert が認識されます)、次のようになります。
そこで待ってください (Connector< Bla1 > a がコメントされていることに注意してください) 私の最初の質問は次のとおりです。
1) アサーションが評価されている場合、含まれているテンプレートがインスタンス化されていると仮定するのは正しいですか?
編集: GMan による回答: static_assert は、テンプレートがインスタンス化されたときではなく、解析中に評価されます。false を sizeof(TypeToBeChecked)==0 に置き換えると、コンパイル時にバインドされます
2) コネクタ テンプレート クラス内の静的アサートが int(int, double) シグネチャを使用して has_foo をインスタンス化しているため、単一パラメーターおよびパラメーターなしの特殊化をインスタンス化するべきではないと仮定するのは正しいですか? 私の仮定の何が問題なのですか?
編集:この仮定は正しいですが、1)の答えに従って修正したので、インスタンス化プロセスは期待どおりに動作しています
3) Connector< Bla1 > 行のコメントを外すと、失敗すると予想されます (Bla1 には 1 つのパラメーター署名を持つ Foo しかないためです。ただし、そうではありません。何が問題なのか、特に最初の考慮事項を考慮してリンクされた投稿
c++ - テンプレート型がインスタンス化可能な場合に何かをする
特定のテンプレート クラスをインスタンス化できる場合は、SFINAE パターンを使用してコードを実行したいと考えています。これを想像してみましょう:
どうすればそれができますか?
どうもありがとう!
編集:私が試したedA-qa mort-ora-yの答えに基づいています:
しかし、これは「有効有効」を返します。私は何が欠けていますか?
c++ - 次の SFINAE テストがテンプレート メンバー関数を検出できないのはなぜですか?
GCC でコンパイルすると、次のコードから常に false になります。これはコンパイラのバグだと思いますが、誰かがもっとよく知っているかもしれません。
c++ - decltype()およびSFINAEを使用したエラー
どこかで他の質問に答えて、私はこのコードを書きました。
Tが、二重右辺値とテンプレートパラメータリテラルを受け入れる非静的メンバー関数 "apply"を提供する場合、結果はtrueである必要があり、それ以外の場合はfalseであるように思われます。ただし、与えられた例は、コンパイル時にクラスBのコンパイルに実際に失敗しますhas_apply<B>
。decltypeステートメントでTの置換が失敗したという事実は、それが単に他の関数を呼び出すことを意味するのではないでしょうか?そういうSFINAEのポイントじゃないですか?
これまでで最もばかげた、無意味な方法で解決しました:
c++ - enable_ifを使用して、クラスのテンプレートパラメータに基づいてメンバー関数を有効にする方法
コード内:
エラーが発生しました:
明らかに、私は使用方法を理解していませんenable_if
。私が考えていたのは、コンパイル時に一連のメンバー関数から1つまたは2番目の1つのメンバー関数を有効にできるが、機能しないということでした。誰かがそれを正しく行う方法を私に説明してもらえますか?
編集
私が本当に理解できないのは、なぜtypedef
それらのdefの1つに存在しないのかということです。コンパイラはそれを見つけることができず、コンパイルしません。
c++ - SFINAEの問題
このコード(クラスMのfnc値)がSFINAEルールによって解決されないのはなぜですか?エラーが発生しました:
もちろん、typeはメンバーではなく、enable_ifのこの一般的なバージョンでは定義されていませんが、boolがtrueの場合にfncのこのバージョンを有効にし、falseの場合はインスタンス化しないというこの背後にある全体的な考え方ではありませんか?誰かが私にそれを説明してもらえますか?