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

c++ - C++ アプリケーションにリフレクションを追加するにはどうすればよいですか?

C++ クラスの名前、内容 (つまり、メンバーとその型) などをイントロスペクトできるようにしたいと考えています。ここでは、リフレクションを持つマネージ C++ ではなく、ネイティブ C++ について話しています。C++ が RTTI を使用して限られた情報を提供していることは理解しています。この情報を提供できる追加のライブラリ (またはその他の手法) はどれですか?

0 投票する
17 に答える
103510 参照

c++ - クラスに特定の署名のメンバー関数があるかどうかを確認します

クラスに特定の署名の特定のメンバー関数があるかどうかを検出するためのテンプレート トリックを求めています。

この問題は、ここで引用されているものと似ています http://www.gotw.ca/gotw/071.htm しかし、同じではありません.Sutterの本の項目で、彼はクラスCがメンバー関数を提供しなければならないという質問に答えました.そうしないと、プログラムはコンパイルされません。私の問題では、クラスにその機能がある場合は何かをする必要があり、そうでない場合は「何か他のこと」をする必要があります。

同様の問題が boost::serialization によって直面されましたが、私は彼らが採用した解決策が好きではありません: 特定のメンバー関数を定義しない限り、特定のシグネチャを持つ無料の関数 (定義する必要がある) をデフォルトで呼び出すテンプレート関数 (その場合、特定の型の 2 つのパラメーターを受け取る「シリアル化」) を特定の署名で行うと、コンパイル エラーが発生します。つまり、侵入型と非侵入型の両方のシリアライゼーションを実装することです。

私は次の 2 つの理由から、このソリューションは好きではありません。

  1. 邪魔にならないようにするには、boost::serialization 名前空間にあるグローバルな「serialize」関数をオーバーライドする必要があります。そのため、クライアント コードで名前空間のブーストと名前空間のシリアル化を開く必要があります。
  2. その混乱を解決するためのスタックは、10 から 12 の関数呼び出しでした。

そのメンバー関数を持たないクラスのカスタム動作を定義する必要があり、私のエンティティは異なる名前空間内にあります (そして、ある名前空間で定義されたグローバル関数を別の名前空間でオーバーライドしたくありません)。

このパズルを解くヒントを教えてください。

0 投票する
33 に答える
198418 参照

c++ - クラスメンバー関数の存在をテンプレート化してチェックしますか?

特定のメンバー関数がクラスで定義されているかどうかに応じて動作を変更するテンプレートを作成することは可能ですか?

これが私が書きたいことの簡単な例です:

したがって、class TtoString()定義されている場合は、それを使用します。それ以外の場合は、そうではありません。やり方がわからない魔法の部分は「FUNCTION_EXISTS」の部分です。

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

c++ - SFINAE を使用して C++ で型の POD 性を検出する

ここでの元のタイトルは 、VS2005 C++ の SFINAE バグの回避策でした。

これは、TR1 に存在する is_pod テンプレート クラスに相当するものを作成するための SFINAE の暫定的な使用です (VS2005 にはまだ TR1 はありません)。テンプレート パラメーターが POD 型 (プリミティブ型とそれらで作成された構造体を含む) の場合はメンバーを true にし、そうでない場合 (非自明なコンストラクターなど) は false にする必要があります。

問題は、VS 2005 に TR1 がないだけでなく、上記の共用体 (テンプレート パラメーターが POD でない場合は有効ではない) を気にしないため、a と b の両方が true と評価されることです。


以下に投稿された回答に感謝します。それら (およびコード) を注意深く読んだ後、私がやろうとしていたことは本当に間違ったアプローチであることに気付きました。アイデアは、SFINAE の動作をテンプレートmust_be_podへの適応と組み合わせることでした (本Imperfect C++で見つけましたが、別の場所でも見つけることができます)。実際、これには SFINAE の非常に特殊なルール セットが必要になりますが、これは明らかに標準で定義されているものではありません。結局のところ、これは実際には VS のバグではありません。

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

c++ - stlアルゴリズムのC++「スマート」述語

find_if、count_ifなどのstlアルゴリズムの述語を設計する必要があります。

ただし、TElementの特定のメソッドの存在に応じて、異なる演算子()を使用する必要があります。「getData」がある場合はそのデータを確認したいのですが、ない場合は他のアクションを実行します。

SFINAEを知っています。しかし、私にはブーストがありません::プロジェクトで。したがって、テンプレート「has_method」の簡単な実装があるか、他の設計ソリューションを知っています。

この述語を「getData」メソッドでそれらの特定のクラスについて知らないプロジェクトライブラリの1つに配置したいので、特定のタイプを指定して単にオーバーロードすることはできません。

名前空間がない限り、クラス特性を使用したソリューションは適切です。述語Finderは「lib」名前空間にあり、「getData」を持つクラスは「program」名前空間にあります。

ありがとう。

0 投票する
10 に答える
55891 参照

c++ - C++ SFINAE の例?

テンプレートのメタプログラミングについてもっと知りたいです。SFINAE は「代入の失敗はエラーではありません」の略であることは知っています。しかし、誰かが SFINAE の良い使い方を教えてくれませんか?

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

c++ - 「T」だけでなく「typename T」と書く必要があるのはなぜですか?

SFINAEに関するウィキペディアの記事を読んでいて、次のコード サンプルに遭遇しました。

今、私は実際に以前にこのようなコードを書いたことがあり、どういうわけか直観的に、単に「T」ではなく「typename T」と入力する必要があることを知っていました。ただし、その背後にある実際のロジックを知っておくとよいでしょう。説明したい人はいますか?