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

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

10
Pythonのジェネリック/テンプレート?
Pythonはジェネリック/テンプレートタイプのシナリオをどのように処理しますか?外部ファイル「BinaryTree.py」を作成し、それがバイナリツリーを処理するようにしたいが、任意のデータ型であるとします。 したがって、カスタムオブジェクトのタイプを渡して、そのオブジェクトのバイナリツリーを作成できます。これはPythonでどのように行われますか?

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 

6
c ++ 11を使用してコードを複製する
私は現在プロジェクトに取り組んでおり、次の問題があります。 私は2つの異なる方法で働きたいC ++メソッドを持っています: void MyFunction() { foo(); bar(); foobar(); } void MyFunctionWithABonus() { foo(); bar(); doBonusStuff(); foobar(); } 実際の関数ははるかに長いので、コードを複製したくありません。問題は、MyFunctionWithABonusの代わりにMyFunctionが呼び出されたときに、いかなる状況でもプログラムに実行時間を追加してはならないということです。そのため、C ++の比較でチェックするブールパラメータだけを使用することはできません。 私の考えは、C ++テンプレートを使用してコードを仮想的に複製することでしたが、追加の実行時間がなく、コードを複製する必要がない方法を考えることはできません。 私はテンプレートの専門家ではないので、何かが足りないかもしれません。 誰かアイデアがありますか?それとも、C ++ 11ではそれは不可能ですか?
80 c++  c++11  templates 

1
依存スコープを持つネストされたテンプレート
依存スコープとは何ですか?次のエラーのコンテキストでのtypenameの意味は何ですか? $ make g++ -std=gnu++0x main.cpp main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope make: *** [all] Error 1 /* * main.cpp */ #include <vector> #include <memory> template<typename T> struct ptrModel { typedef std::unique_ptr<T> Type; }; template<typename Data> struct ptrType { typedef ptrModel< std::vector<Data> …
79 c++  templates  scope  nested 

3
コンパイル時に多次元std :: vectorの深さを取得するにはどうすればよいですか?
多次元を取りstd::vector、深さ(または次元数)をテンプレートパラメーターとして渡す必要がある関数があります。この値をハードコーディングする代わりに、を使用して深さを値として返すconstexpr関数を作成します。std::vectorunsigned integer 例えば: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, 5}, { 6, 7 } }, }; // Returns 3 size_t depth = GetDepth(v); この深さはテンプレート関数としてテンプレート関数に渡されるため、コンパイル時にこれを行う必要があります。 // Same as calling foo<3>(v); foo<GetDepth(v)>(v); これを行う方法はありますか?

4
テンプレートメタプログラミング
誰かが最初のテンプレートのメタプログラミング方法が無限ループになる理由を私に説明できますが、2番目の方法は正しく実行されます。 #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val : commondivs<(N-M),M>::val; }; template<int N> struct commondivs<N,N> { static const int val = N; }; int commondiv(int N, int M){ if(N==M){ return N; } return (N<M)?commondiv(N,(M-N)):commondiv((N-M),M); } int main() …

2
関数でremove_referenceが機能しないのはなぜですか?
先日、テンプレートのメタプログラミングを行っているときに、奇妙なことに遭遇しました。それは基本的にこの主張に帰着します(私が期待するとおり)通過しません。 static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); 最初は、関数参照を定義する構文上の間違いを犯していると思っていましたが、このアサーションは成功し、そうではないことがわかりました。 static_assert(std::is_same_v<void()&, void()&>); またremove_reference、cppreferenceからソースをコピーして自分で実装しようとしましたが、それも機能しませんでした。ここで何が起こっているのですか?
38 c++  templates  types  c++17 

4
テンプレートを使用した関数のオーバーロード
テンプレートを使用して関数を定義しようとしています。型名をintまたはanEnum(定義した特定の列挙型)にしたいのですが。私は以下を試しましたが失敗しました: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const T &aVariable){} 私がやろうとしていることは、2つのオーバーロードされた関数を定義する代わりに、テンプレートを使用することです。プログラマがタイプを考慮する必要なしに、次のように関数を呼び出す方がいいです isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable) 基本的に、この関数をintおよびaNumタイプ用にテンプレート化します。私はこれを検索しましたが、答えが見つかりませんでした。何が欠けているのでしょうか?ありがとうございました、

3
C ++でタイプリストの方法デカルト積を作成するにはどうすればよいですか?
自明です。 基本的に、次のようなタイプのリストがあるとします。 using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; タイプリストの可変数にすることができます。 デカルト積のタイプリストを取得するにはどうすればよいですか? result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; 私はここに与えられているように双方向のデカルト積を作成する方法について手を出しました:タイプリストのデカルト積を作成する方法?、しかしnウェイはそれほど簡単ではないようです。 とりあえずやっています... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... Us> constexpr auto …

4
ジェネリック引数として特定のタイプを持つSTLコンテナー
特定のタイプのコンテナをstd::stringパラメータとして受け取る関数を作成する方法はありますか? void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } そして、入力としてすべてのタイプのstlコンテナーに対してそれを呼び出しますか?上記のように? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);

1
関数パラメーターのテンプレート引数プレースホルダーとしての「auto」
C ++ 20ではauto、関数パラメーター型を使用できます。 関数パラメーター型のautoテンプレート引数プレースホルダーとして使用することもできますか(似ていないが、C ++ 17 template <auto>の精神で)。 したがって、C ++ 20より前の次のコード: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } 次のように書くことができます: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; } それはコンパイルし、概念の実験的なGCC実装でうまく動作します。 C ++ 20での正当な構文ですか?
22 c++  templates  auto  c++20 

4
テンプレート型の正しいコンストラクターを呼び出す方法は?
次のコードでは、コメント行をそのすぐ上の行と同じように機能させるにはどうすればよいですか? テンプレートの適切なコンストラクターを呼び出す汎用コードにしたいと思いTypeます。 #include <string> #include <iostream> template <typename Type> struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class<std::string> a = std::string("abc"); // Class<std::string> b = "abc"; std::cout << a.data << std::endl; return 0; }


1
テンプレートの自動戻りタイプとあいまいさ
オーバーロードされたテンプレート関数があります: template<typename T1, typename T2> auto overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; } template<typename RT, typename T1, typename T2> RT overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; …

4
std :: functionがオーバーロードの解決に参加しないのはなぜですか?
次のコードはコンパイルできません。 void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } ので、std::function私は読んでの通りですが、オーバーロードの解決を考慮することはないと述べ、この他のポスト。 この種のソリューションを強制した技術的な制限を完全には理解していません。 cppreference で翻訳のフェーズとテンプレートについて読みましたが、反例を見つけることができなかった理由は思いつきません。平凡な人(まだC ++の新人)に説明すると、何がどの翻訳段階で上記のコンパイルが失敗しますか?

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