問題タブ [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 投票する
7 に答える
4872 参照

c++ - テンプレート化された関数が存在する場合はそれを呼び出す方法、そうでない場合は他の何かを呼び出す方法は?

こんなことしたい

ここでは、何かを使って2つenable_ifに分割することでうまくいくと思いfooましたが、詳細がわからないようです。これを達成する最も簡単な方法は何ですか?

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

c++ - SFINAE がこれに適用されないのはなぜですか?

Visual Studio 10 (Beta 2) を試しながら簡単なポイント コードを書いています。SFINAE が作動すると思われる場所でこのコードをヒットしましたが、そうではないようです。

これは与えるerror C2512: 'point<T>::point' : no appropriate default constructor available

これはベータ版であるため、オンラインの comeau コンパイラで簡単なサニティ チェックを行ったところ、同じエラーに一致するため、この動作は正しいように見えますが、その理由はわかりません。

この場合、いくつかの回避策は、単純に をインライン化するかdecltype(T() / U())、ポイント クラスにデフォルト コンストラクターを与えるか、完全な結果式で decltype を使用することですが、op_div のバージョンで発生していたエラーを単純化しようとしているときに、このエラーが発生しました。デフォルトのコンストラクター*を必要としなかったので、機能することだけを行うのではなく、C++の理解を修正したいと思います.

ありがとう!


*: オリジナル:

を与えerror C2784: 'point<op_div<T,U>::type> operator /(const point<T> &,const U &)' : could not deduce template argument for 'const point<T> &' from 'int'point<T> / point<U>過負荷に対しても。

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

c++ - オプションのデフォルトコンストラクターを使用するにはどうすればよいですか?

このクラス:

T にデフォルトのコンストラクターがない場合はコンパイルされません。これです:

T にデフォルトのコンストラクターがあっても、デフォルトのコンストラクターはありません。

両方が欲しい - T() がない場合、A() は必要ありません。

SFINAE を使用する必要があることはわかっています。Boost.traits と Boost.enable_if は役に立ちますが、うまくいきません。誰かがこの単純なケースの例を教えてもらえますか?

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

c++ - 継承されたメンバー関数をチェックするSFINAE

SFINAEを使用すると、特定のクラスに特定のメンバー関数があるかどうかを検出できます。しかし、継承されたメンバー関数をテストしたい場合はどうなりますか?

以下は、VC8およびGCC4では機能しません(つまりA、メンバー関数を持っているが、それを継承しfoo()ていないことを検出します)。B

では、継承されたメンバー関数をテストする方法はありますか?

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

c++ - SFINAE canAdd テンプレートの問題

2 つのクラスを一緒に追加できるかどうかを判断するために、SFINAE テンプレートを作成しようとしています。これは主に、特定の「現実世界」の理由ではなく、SFINAE がどのように機能するかをよりよく理解するためのものです。

だから私が思いついたのは

これは、最後の行を除くすべてについてコンパイルされ、次のようになります。

したがって、このエラーは私が予想するようなものですが、コンパイラーが test_sfinae( ... ) 定義を見つけて代わりに使用することを期待します (そして、解析しないものについて不平を言うことはありません.

明らかに何かが欠けています。それが何であるかわかりません。

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

c++ - SFINAE +sizeof=式がコンパイルされるかどうかを検出する

operator<<タイプに提供されているかどうかを確認する方法を見つけました。

このトリックはよく知られていますか、それともメタプログラミングのノーベル賞を受賞したばかりですか?;)

編集:コードを理解しやすくし、2つのグローバル関数テンプレート宣言lvalue_of_typeとで適応しやすくしましrvalue_of_typeた。

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

c++ - クラスに特定のテンプレート化されたメンバー関数があるかどうかを判断する方法は?

SFINAE アプローチを拡張して、クラスに特定のメンバー関数があるかどうかを検出できるかどうか疑問に思っていました (ここで説明したように:

「クラスが特定の署名のメンバー関数を持っているかどうかを知るためのテクニックは C++ にありますか?」 クラスに特定の署名のメンバー関数があるかどうかを確認します

) テンプレート化されたメンバー関数をサポートするには? たとえば、次のクラスで関数 foo を検出できるようにします。

void foo< 5 >()次のように、foo の特定のインスタンス化 (たとえば、メンバーかどうかを確認する) に対してこれを行うことが可能であると考えました。

次に、メンバーがあるfoo_int_checker< some_class, 5 >::valueかどうかを確認します。ただし、MSVC++ 2008 では、これは常に返されますが、g++ では次の構文エラーが行に表示されます。some_classvoid foo< 5 >()falsetest( sfinae< _t, &_t::foo< _n > > );

それ自体がテンプレート パラメーターである型からテンプレート関数のインスタンス化のアドレスを取得しようとしているため、どちらも失敗しているようです。これが可能かどうか、または何らかの理由で標準で許可されていないかどうかを知っている人はいますか?

::template編集: g++ で上記のコードを正しくコンパイルするための構文を見逃したようです。関数のアドレスを取得するビットを に変更すると&_t::template foo< _n >、プログラムはコンパイルされますが、MSVC++ と同じ動作になります (valueは常に に設定されfalseます)。

のオーバーロードをコメントアウトして、コンパイラに別の...オーバーロードtestを強制的に選択させると、g++ で次のコンパイラ エラーが発生します。

ここで、32行目がenum { value = sizeof( test< _class >( 0 ) ) == sizeof( big ) };行です。残念ながら、これは問題の診断に役立たないようです:(。MSVC ++は同様の説明のないエラーを返します:

同じ行に。

奇妙なことに、テンプレート パラメーターではなく特定のクラスからアドレスを取得すると (つまり、私が取得するのではなく&_t::template foo< _n >) &some_class::template foo< _n >、正しい結果が得られますが、チェッカー クラスは関数に対して単一のクラス ( some_class) をチェックすることに制限されます。また、次のことを行うと:

を呼び出すとf1< some_class >()、 でコンパイル エラーが発生しません&_t::template foo< 5 >。これは、SFINAE コンテキスト内で、それ自体がテンプレート パラメーターである型からテンプレート化されたメンバー関数のアドレスを取得する場合にのみ問題が発生することを示唆しています。ああ!

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

c++ - これが機能する理由(テンプレート、SFINAE)。C ++

昨日の投稿を参考にすると、今朝は目が覚めました。なぜこれが実際に機能するのですか?関数testに関する限り、この関数には本体がないので、どのように実行できますか?これがなぜ、どのように機能するのか知りたいですか?私はあなたの答えを見ることに本当に興味があります。

この非常に興味深い現象を理解するために助けを借りて事前に感謝します。

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

c++ - ロギング用クラスのモジュール名を宣言

現在、ログ ライブラリにいくつかの機能を追加しています。これらの 1 つは、そのクラス内から書き込まれるすべてのログ メッセージに自動的に付加されるクラスのモジュール名を宣言する可能性です。ただし、モジュール名が指定されていない場合は、先頭に何も追加されません。現在、名前を返す静的関数を持つ特性クラスを使用しています。

このクラスは、ヘルパー マクロを使用して定義できます。欠点は、モジュール名をクラスの外で宣言する必要があることです。クラス内でできるようにしてほしい。また、プリプロセッサ ディレクティブを使用してすべてのロギング コードを削除できるようにしたいと考えています。SFINAE を使用すると、テンプレート引数に特定のメンバーが含まれているかどうかを確認できますが、テンプレートに慣れていない他の人がコードを維持する必要があるため、より簡単なソリューションを探しています。何もない場合は、特性アプローチに固執します。

前もって感謝します!

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

c++ - 複数のSFINAEルール

この質問への回答を読んだ後、クラスに特定のメンバー関数があるかどうかに基づいて、SFINAEを使用して2つの関数から選択できることを学びました。これは次と同等ですが、ifステートメントの各ブランチがオーバーロードされた関数に分割されているだけです。

になります

SFINAEを拡張して複数のルールを実行できるかどうか疑問に思いました。これに相当するもの:

このようなことは可能ですか?

ありがとうございました。