タグ付けされた質問 「sfinae」

27
クラスメンバー関数の存在のテンプレートチェック?
クラスで特定のメンバー関数が定義されているかどうかに応じて動作を変更するテンプレートを作成することは可能ですか? これが私が書きたいことの簡単な例です: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return obj->toString(); else return "toString not defined"; } したがって、定義されclass Tている場合はtoString()、それを使用します。そうでなければ、それはしません。方法がわからない魔法の部分は、「FUNCTION_EXISTS」部分です。

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

3
関数シグネチャでstd :: enable_ifを避ける必要があるのはなぜですか
スコットマイヤーズは、彼の次の本EC ++ 11の内容とステータスを投稿しました。この本の1つの項目は、「std::enable_if関数のシグネチャでの回避」である可能性があると書いています。 std::enable_if 関数の引数として、戻り値の型として、またはクラステンプレートまたは関数テンプレートのパラメーターとして使用して、関数またはクラスをオーバーロードの解決から条件付きで削除できます。 で、この質問すべての3つの解決策を示しています。 関数パラメーターとして: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; テンプレートパラメータとして: template<typename T> struct Check2 …

2
`void_t`の仕組み
私はウォルターブラウンがCppcon14で最新のテンプレートプログラミング(パートI、パートII)について語った彼のvoid_tSFINAEテクニックのプレゼンテーションを見ました。 例:すべてのテンプレート引数が正しい形式であるかどうか を評価する単純な変数テンプレートvoidがあるとします。 template< class ... > using void_t = void; そして、memberと呼ばれるメンバー変数の存在をチェックする次の特性: template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class T > struct has_member< T , void_t< decltype( T::member ) > > …
149 c++  templates  c++14  sfinae 

16
クラスに特定のシグネチャのメンバー関数があるかどうかを確認する
私は、クラスが特定の署名の特定のメンバー関数を持っているかどうかを検出するためのテンプレートトリックを求めています。 問題はここで引用したものと似てい ます が、同じではありません。Sutterの本の項目で、クラスCがメンバー関数を提供する必要があるという質問に答えました特定の署名がないと、プログラムはコンパイルされません。私の問題では、クラスにその機能がある場合は何かをする必要があります。 同様の問題がboost :: serializationにも直面しましたが、私が彼らが採用した解決策は好きではありません。特定のメンバー関数を定義しない限り、デフォルトで特定のシグネチャを持つフリー関数(定義する必要がある)を呼び出すテンプレート関数(彼らの場合、特定のシグネチャを持つ特定のタイプの2つのパラメータをとる「シリアライズ」、それ以外の場合、コンパイルエラーが発生します。それは、侵入型と非侵入型の両方のシリアライゼーションを実装することです。 次の2つの理由で、このソリューションは好きではありません。 非侵入型にするには、boost :: serialization名前空間にあるグローバルな「serialize」関数をオーバーライドする必要があります。これにより、クライアントコードで名前空間のブーストと名前空間のシリアル化を開くことができます。 この混乱を解決するためのスタックは、10〜12の関数呼び出しでした。 そのメンバー関数を持たないクラスのカスタム動作を定義する必要があり、エンティティは異なる名前空間内にあります(ある名前空間で定義されているグローバル関数を別の名前空間にある間にオーバーライドしたくない) このパズルを解くためのヒントを教えてもらえますか?
135 c++  c++11  templates  sfinae 

9
C ++ SFINAEの例?
テンプレートのメタプログラミングについてもっと知りたいです。SFINAEが「置換の失敗はエラーではない」の略であることを知っています。しかし、誰かがSFINAEの良い使い方を私に示すことができますか?

2
std :: is_functionはどのように実装されていますか?
次の実装はstd::is_functionどうですか? template<class T> struct is_function : std::integral_constant< bool, !std::is_const<const T>::value && !std::is_reference<T>::value > {}; (CPPリファレンスから) 私には思える、intこの定義の下での関数でしょう。何が欠けていますか?
82 c++  templates  std  sfinae 

2
C ++でSFINAEを機能させる方法
プロジェクトで関数SFINAEを頻繁に使用しており、次の2つのアプローチ(スタイル以外)に違いがあるかどうかはわかりません。 #include <cstdlib> #include <type_traits> #include <iostream> template <class T, class = std::enable_if_t<std::is_same_v<T, int>>> void foo() { std::cout << "method 1" << std::endl; } template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0> void foo() { std::cout << "method 2" << std::endl; } int main() { foo<int>(); foo<double>(); std::cout << "Done..."; std::getchar(); …
40 c++  sfinae 

2
一致するテンプレートクラスの部分クラステンプレートの特殊化が、テンプレートが一致しない別の部分的特殊化とあいまいであるのはなぜですか?
質問はタイトルの文章で説明するには難しすぎるかもしれませんが、これは最小限の例です: #include <iostream> #include <type_traits> template <class T, class U, class Enabler> struct my_trait : std::false_type {}; template <class T, class U> struct my_trait<T, U, std::enable_if_t<std::is_same<T, U>::value>> : std::true_type {}; template <class T> class temped {}; template <class T> struct my_trait<temped<T>, temped<T>, void> : std::false_type {}; template <class T, class …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.