タグ付けされた質問 「template-specialization」

6
C ++関数テンプレートの部分的な特殊化?
以下のコードはクラスの部分的な特殊化であることを私は知っています: template <typename T1, typename T2> class MyClass { … }; // partial specialization: both template parameters have same type template <typename T> class MyClass<T,T> { … }; また、C ++では関数テンプレートの部分的な特殊化が許可されていないことも知っています(完全のみが許可されています)。しかし、私のコードは、関数テンプレートを1つ/同じ型の引数に部分的に特化したことを意味しますか?Microsoft Visual Studio 2010 Expressで動作するためです!いいえの場合、部分特殊化の概念について説明していただけますか? #include <iostream> using std::cin; using std::cout; using std::endl; template <typename T1, typename T2> inline T1 max …

4
関数テンプレートを部分的に特殊化できないのはなぜですか?
言語仕様が関数テンプレートの部分的な特殊化を禁止していることを私は知っています。 なぜそれが禁止されているのか、その理由を知りたいのですが?それらは役に立ちませんか? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!

1
Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?
次のクラステンプレートがあるとします。 template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; のInner専門化ごとに個別に定義しますOuter。 template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; 次にf、すべての特殊化についてメンバー関数を1回定義しますOuter。 auto Outer<T>::f(Inner) -> void { } しかしClang(9.0.0)は不平を言います: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ Inner他のすべての特殊化の定義も提供することにより、コンパイラエラーを回避できますOuter。 template<typename T> struct Outer<T>::Inner {}; または、f専門化ごとに個別に定義することにより: template<> auto …

1
クラスの特殊化におけるclang / gccの不整合
特化しようとしているときに、私はこの問題に出くわしtuple_size/ tuple_elementC ++ 17の構造の結合のためのカスタムクラス。 以下のコードはGCCでコンパイルされますが、clangではコンパイルされません(両方のトランクバージョン、以下のリンクを参照)。 #include <type_traits> template<typename T, typename... Ts> using sfinae_t = T; template<typename T, bool... Bs> using sfinae_v_t = sfinae_t<T, typename std::enable_if<Bs>::type...>; template <typename T> struct Test; template <typename T> struct Test<sfinae_v_t<T, std::is_integral_v<T>>> {}; void f() { Test<int> t; } https://godbolt.org/z/ztuRSq これは、clangによって提供されるエラーです。 <source>:13:8: error: class template partial …

1
C ++でのif / elseブランチのコンパイル時の削除
次のコードサンプルでは、ifステートメントはboolコンパイル時定数であるテンプレートパラメーターに依存しています。コンパイラはこのコードを別の方法で処理します。 MSVCはリンクエラーで失敗します(これは私が予想したことです)。elseブランチのテンプレート関数にはtrueテンプレートパラメーター値の特殊化がないため(呼び出されることはありません)。 GCCとClangはどちらも問題なくコンパイルされ、実行時の動作は正しいです。これはif、コンパイル時にステートメントを評価し、リンクする前に未使用のブランチを削除するためです。 問題は、どの動作が標準に準拠しているか(または、未定義の動作であり、どちらも独自の方法で正しいか)です。 #include <iostream> template<const bool condition> struct Struct { void print() { if (condition) { std::cout << "True\n"; } else { printIfFalse(); } } private: void printIfFalse(); }; template <> void Struct<false>::printIfFalse() { std::cout << "False\n"; } int main() { Struct<true> withTrue{}; withTrue.print(); Struct<false> withFalse{}; withFalse.print(); return …

1
配列サイズの妥当性に基づく専門化
配列サイズの妥当性に基づいて特化しようとしています: // base template template<int p, typename T = void> struct absolute { operator int () const { return 0; } }; // positive case template template<int p> struct absolute<p, typename std::void_t<int[p]>> { operator int () const { return p; } }; // negative case template template<int p> struct absolute<p, …

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.