問題タブ [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を使用すると、型に特定のデータ メンバーまたはメンバー関数があるかどうかを検出できます。タイプが存在するかどうかを検出するためにも使用できますか? 背景: 含まれているかどうかを知りたい<vector>
。
c++ - テンプレートパラメータがイテレータ型かどうかを確認する方法は?
問題は、5 つの assert ステートメントを渡す方法です。
c++ - SFINAEコンパイラのトラブル
私の次のコードは、T
持っているかどうかbegin
とend
メソッドを検出する必要があります。
そしてここにいくつかのテストコードがあります:
g ++ 4.5.1では、出力は1 1 1 1
です。ただし、Visual Studio 2008では、出力は1 1 0 0
です。私は何か間違ったことをしましたか、それともこれは単にVS 2008のバグですか?誰かが別のコンパイラでテストできますか?ありがとう!
c++ - テンプレート引数にメンバー関数があるかどうかの確認
これは私の以前の質問と非常に似ています。テンプレート引数にメンバー関数が含まれているかどうかを確認したい。
私は前の質問で受け入れられた答えと同様のこのコードを試しました。
しかし、それを機能させるために何を代わりに置くべきかわかりません???
。SFINAEの概念は初めてです。
c++ - SFINAE アプローチの比較
member_func
次のコードは、コンパイル時に型 (基本的にはクラス) にメンバー関数が含まれているかどうかを確認する SFINAE 実装を示しています。
ただし、私の質問は、どちらのアプローチを好むか (アプローチ 1 またはアプローチ 2) とその理由です。
与えられたアプローチに矛盾はありますか? はいの場合はお知らせください。
PS:仮定sizeof(char)!= sizeof(long)
c++ - SFINAE/テンプレートを使用してオペレーターが存在するかどうかを確認することはできますか?
コンパイル時に演算子が存在するかどうかを確認しようとしていますが、そうでない場合は無視したいのですが、それを行う方法はありますか?
演算子の例:
c++ - SFINAEおよびC++関数オブジェクトがvoidを返すかどうかの検出
私はこれに関するさまざまな当局を読みましたが、デューハーストを含みますが、この一見単純な質問でどこにも到達することができませんでした。
私がやりたいのは、C ++関数オブジェクト(基本的には、呼び出し可能なもの、純粋関数、または()を使用したクラス)を呼び出し、それが無効でない場合はその値を返すか、そうでない場合は「true」を返すことです。
アップデート
考えやアイデアをありがとう!
これに基づいて、私は実際にすべてのテンプレートを1つのレベルに上げることにしました。そのため、代わりに次のようになります。
さまざまなオブジェクトやメソッドを実行するためのジェネリッククラス。私をその方向に押しやったコードをくれたMr.Reeに感謝します!
c++ - メンバー関数の存在のチェックを関数の引数に適応させる
私は
、通常の (非メンバー) 関数の存在を可能にするために、このソリューションを適応させようとしています。char const* c_str() const
私の場合、T がメンバー関数を持っているなど、任意の文字列型 T を取るグローバル文字列ユーティリティ型関数がたくさんあります。
目標は、ユーザーがメンバー関数を持たない型 T を渡そうとした場合の奇妙なコンパイラ エラー メッセージを排除することですc_str()
。つまり、コンパイラが「c_str(): そのようなメンバー関数はありません」と言うのではなく、 , "foo(T&): no such function"foo
はグローバル関数です。
適応されたコードは次のとおりです。
ただし、上に示したように、コンパイラは「認識」しf(S&)
ません。
c++ - SFINAE: クラスにフリー関数があるかどうかを検出する
SFINAE を使用して、特定のクラスに対してフリー関数がオーバーロードされているかどうかを検出する方法はありますか?
基本的に、私は次の解決策を持っています:
call
実際には多くのfoo
andbar
型があり、関数はそれらを認識していないため、単純なオーバーロードは機能しませんcall
(基本的call
に a 内にあり、ユーザーが独自の型を提供します)。
私は C++0x を使用できません。最新のすべてのコンパイラに対応するソリューションが必要です。
注: 残念ながら、同様の質問に対する解決策はここでは機能しません。
c++ - 不適切な形式の C++0x コードまたはコンパイラのバグですか?
次の C++0x コードでは、クローン メンバー関数 (存在する場合) を使用してオブジェクトのクローンを作成し、コピー コンストラクターにフォールバックしようとしました。
アイデアは、 auto...->decltype(expr) を使用して、テンプレート引数推定 (SFINAE) の一部として不適切な形式の式を除外し、2 番目の関数に関して部分的な順序付けを介して、両方のクローン関数テンプレート間の可能なあいまいさを解決することです。パラメータ。
残念ながら、GCC 4.5.1 はこのプログラムを受け入れません:
さて、問題は、これはコンパイラのバグなのか、それとも SFINAE がここに適用されると仮定するのは間違っていたのかということです。根拠のある回答をいただければ幸いです。
編集:この場合、最初の関数テンプレートを優先するオーバーロードの解決のために、コード
に変更decltype(new T(*ptr))
するとコンパイルされます。T*
しかし、これは式を関数宣言の一部として持つ目的に反します。目的は、エラーが発生した場合に、オーバーロード解決セットからコンパイラーが関数を追い出すようにすることです。