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

テンプレートタグは、汎用プログラミング(特にC ++)、およびテンプレートエンジンを使用したデータ/ドキュメントの生成など、複数のコンテキストで使用されます。このタグを実装の重い質問に使用する場合-実装が記述されているコード言語にタグを付けます。

1
変数テンプレートをテンプレートテンプレート引数として渡すことはできますか?
次の無意味な例はコンパイルされませんが、変数テンプレートをテンプレートテンプレート引数として渡す他の方法はありますか? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } コンパイラエクスプローラーを試す

2
C ++テンプレートテンプレート引数タイプの控除
文字列のコンテナを調べて、パターンの一致を見つけて出力するコードがあります。テンプレート化された関数fooで印刷が実行されます コード #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string> #include <tuple> #include <utility> template<typename Iterator, template<typename> class Container> void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings) { for (auto const &finding : findings) { std::cout << "pos = " << std::distance(first, finding.first) << " "; std::copy(finding.first, finding.second, std::ostream_iterator<char>(std::cout)); …

1
テンプレートテンプレートクラスでのGCC / C ++ 17の問題
次の2つのオーバーロードを検討してください template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } 1つ目は通常のクラスで機能し、2つ目はインスタンス化されていないテンプレートで機能します。例えば: std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 ここで、次のテンプレート関数を考えます。 template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } }; return test<A>(); …
10 c++  templates  gcc  clang  c++17 

2
関数型の引数のテンプレート引数の控除
次のプログラムを検討してください。 #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } プログラムは正常にコンパイルされ、その出力は g( 42 ); 今度は、非テンプレート関数の名前を変更してみましょうgにf。 #include <iostream> …

3
次の場合に依存型にtypenameを使用する必要がないのはなぜですか?
型の参照の削除については、ここで読んでいます。 次の例を示します。 #include <iostream> // std::cout #include <type_traits> // std::is_same template<class T1, class T2> void print_is_same() { std::cout << std::is_same<T1, T2>() << '\n'; } int main() { std::cout << std::boolalpha; print_is_same<int, int>(); print_is_same<int, int &>(); print_is_same<int, int &&>(); print_is_same<int, std::remove_reference<int>::type>(); // Why not typename std::remove_reference<int>::type ? print_is_same<int, std::remove_reference<int &>::type>();// Why …


2
C ++がFoo <T> :: Foo(T &&)の呼び出しでTを推定できないのはなぜですか?
次のテンプレート構造があるとします。 template&lt;typename T&gt; struct Foo { Foo(T&amp;&amp;) {} }; これはコンパイルTされ、次のように推定されますint。 auto f = Foo(2); しかし、これはコンパイルされません:https : //godbolt.org/z/hAA9TE int x = 2; auto f = Foo(x); /* &lt;source&gt;:12:15: error: no viable constructor or deduction guide for deduction of template arguments of 'Foo' auto f = Foo(x); ^ &lt;source&gt;:7:5: note: candidate function …

2
C ++-ここで「テンプレート」キーワードが必要なのはなぜですか?
私は次のコードを持っています: template &lt;typename TC&gt; class C { struct S { template &lt;typename TS&gt; void fun() const {} }; void f(const S&amp; s) { s.fun&lt;int&gt;(); } }; // Dummy main function int main() { return 0; } これをgcc 9.2とclang(9.0)の両方でビルドすると、templateを呼び出すために必要なキーワードが原因で、コンパイルエラーが発生しますfun。Clangのショー: error: use 'template' keyword to treat 'fun' as a dependent template name …

1
関数ポインターの配列から関数ポインターをテンプレート引数として渡す
関数ポインターの配列から関数ポインターをテンプレート引数として渡したいのですが。Intellisenseが何かがおかしいと文句を言うのに、私のコードはMSVCを使用してコンパイルしているようです。gccとclangはどちらもコードのコンパイルに失敗します。 次の例を考えてみます。 static void test() {} using FunctionPointer = void(*)(); static constexpr FunctionPointer functions[] = { test }; template &lt;FunctionPointer function&gt; static void wrapper_function() { function(); } int main() { test(); // OK functions[0](); // OK wrapper_function&lt;test&gt;(); // OK wrapper_function&lt;functions[0]&gt;(); // Error? } MSVCはコードをコンパイルしますが、Intellisenseは次のエラーを出します:invalid nontype template argument of type "const …
9 c++  templates  c++14 

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

5
テンプレートで正しいタイプのデータを返す方法は?
#include &lt;iostream&gt; using namespace std; template &lt;class X, class Y&gt; Y big(X a, Y b) { if (a &gt; b) return (a); else return (b); } int main() { cout &lt;&lt; big(32.8, 9); } ここではCPPでテンプレートを使用しているためbig、doubleとinttypeの引数をバイパスして関数を呼び出すと、である返答が必要ですdouble。ここではタイプで、の32代わりに返されます32.8。 どのようにして希望の出力を得るのですか big関数の適切な戻り値の型を記述する方法は?

1
テンプレートと名前検索を理解しようとする
次のコードスニペットを理解しようとしています スニペット#1 template &lt;typename T&gt; struct A { static constexpr int VB = T::VD; }; struct B : A&lt;B&gt; { }; ここでは、gcc9もclang9もエラーをスローしません。 Q.このコードがコンパイルされるのはなぜですか?A&lt;B&gt;Bから継承するときにインスタンス化していませんか?BにはVDがないので、コンパイラーはここでエラーをスローすべきではありませんか? スニペット#2 template &lt;typename T&gt; struct A { static constexpr auto AB = T::AD; // &lt;- No member named AD in B }; struct B : A&lt;B&gt; { …

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

1
#1664の提案された解決策を理解する方法
#1664の提案された解決策(提案された解決策1664)を見た後、私は関数テンプレートのデフォルト引数のルールに混乱しています、ここにコンテンツを引用してください: 8.1.5 [expr.prim.lambda]パラグラフ3によると クロージャタイプは、対応するラムダ式を含む最小のブロックスコープ、クラススコープ、または名前空間スコープで宣言されます。[注:これにより、クロージャタイプに関連付けられた名前空間とクラスのセットが決まります(6.4.2 [basic.lookup.argdep])。ラムダ宣言子のパラメータタイプは、これらの関連する名前空間とクラスには影響しません。—エンドノート] ただし、17.8.1 [temp.inst]パラグラフ13には、 デフォルトの引数を使用する必要がある方法で関数テンプレートfが呼び出された場合、依存名が検索され、セマンティクスの制約がチェックされ、デフォルトの引数で使用されているテンプレートのインスタンス化は、デフォルトの引数のように行われます。その時点で使用されている関数テンプレートfと同じスコープ、同じテンプレートパラメータ、同じアクセス権を持つ関数テンプレートの特殊化で使用される初期化子でした。 その場合、可能性は、テンプレート関数(または、おそらく、クラステンプレートのメンバー関数)のデフォルト引数のラムダ式のクロージャタイプが、の本体のブロックスコープで宣言されていると見なされることです。架空の機能テンプレートの特殊化。 次の例を考えてみましょう。 namespace J { inline namespace K { template &lt;typename T&gt; int zap(const T &amp;t) { foo(t); return 0; } template &lt;typename T&gt; void zip(int = zap([] { })) { } } template &lt;typename T&gt; void foo(const T &amp;) { } …

1
オーバーロードされた関数ポインターとその引数を渡す際の不正な型の推定
std::invoke関数がオーバーロードされている場合でも、関数タイプを推定する作業を行うためのラッパーを提供しようとしています。 (私は昨日、可変およびメソッドポインターバージョンについて関連する質問をしました)。 関数に1つの引数がある場合、このコード(C ++ 17)は通常の過負荷状態で期待どおりに機能します。 #include &lt;functional&gt; template &lt;typename ReturnType, typename ... Args&gt; using FunctionType = ReturnType (*)(Args...); template &lt;typename S, typename T&gt; auto Invoke (FunctionType&lt;S, T&gt; func, T arg) { return std::invoke(func, arg); } template &lt;typename S, typename T&gt; auto Invoke (FunctionType&lt;S, T&amp;&gt; func, T &amp; arg) { return …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.