問題タブ [template-templates]
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.
c++ - gcc 4.4 でのテンプレート テンプレート パラメーターと可変個引数テンプレート
Debian スクイーズで gcc 4.4 を使用しています。次のコードを検討してください。
したがって、ここでの考え方は、T
matches string
、C
matches map
、およびテンプレート パラメーター パックのArgs
matchesint
です。構文の一部が間違っている可能性があります。その場合は修正してください。特に、最初のテンプレート引数class C
を一致T
させ、残りをテンプレート パラメータ pack と一致させたい場合、構文は正しいですかArgs
?template <typename T, typename... Args> class C
これにより、エラーが発生します
これは、質問Variadic template templates and perfect forwardingに似ているようです。その質問は、これが gcc のバグであることを示唆していますが、これらの質問が同じことであると誤解している可能性があります。
優しくしてください。可変個引数テンプレートに関する私の知識は、12 時間も経っていません。重複を減らすために、いくつかの古い C++ コードを書き直そうとしていました。私がC++をやったのも久しぶりです。回避策がある場合は、お知らせください。ありがとう。
編集: Variadic テンプレート テンプレートのコメントで提案された回避策と、Ise Wisteriaによる完全な転送がうまくいきました。これは、これが同じバグであることを示唆しています。もちろん、私は今、(a) この回避策がどれほど壊れやすいか、(b) なぜ機能するのか、伊勢がそれを考えた動機は何なのか、疑問に思っています。伊勢しか答えられないんだろうけど。:-)
c++ - 可変個引数テンプレート引数パックのメンバーに存在する内部テンプレートtypedefにアクセスするにはどうすればよいですか?
私には明白に見えるコードがいくつかありますが、gcc4.7はそれに窒息しています:
この方法でInnerMixinsにアクセスすることに何か問題がありますか?私がそれを書いたとき、それはかなり合理的であるように見えました:)
c++ - 部分的なテンプレート テンプレートの特殊化
このコードがあります:
ただし、場合によってはasT*
の代わりに使用する必要があります- 次のように:std::list<T>
InnerCont
この場合、「テンプレート テンプレート」パラメーターの部分的な特殊化を使用することは可能ですか?
または、頭痛を最小限に抑えてアーカイブする方法..
c++ - 特定のテンプレートのインスタンス化である typename パラメーターのテンプレートの特殊化
Z
特定のテンプレートの任意のインスタンス化である型を渡したときに特化したいクラス テンプレートがありN
ます。
Z<int, L>
とZ<int, N<int>>
とはすべて有効なユース ケースであるため、テンプレート テンプレートに変換する方法Z<int, M<int>>
に沿って何もすることはできません。これを達成する方法はありますか?Z
Z<TX, TY>::bar(TX &)
TY
N
c++ - テンプレートのインスタンス化におけるテンプレート テンプレート引数の可能な形式
テンプレート パラメーターの可能な形式の 1 つは、クラス テンプレートです。C++ 標準 (C++2003) では、テンプレートのインスタンス化中のテンプレート テンプレート パラメーターの引数は "id-expression" であると規定されています。この非終端記号はかなり広いです。デストラクタ、オーバーロードされた演算子などを許可します。たとえば、次のコードは正常にコンパイルされるはずです。
最後の 2 行は意味がありません。しかし、文法の観点からは、それらは問題ありません。文法は言語を正確に記述するものではありません (またそうすべきではありません) が、段落 14.3.3、「テンプレート テンプレート引数」では、この文脈における文法規則の制限について言及していません。
誰かが私の声明を受け入れたり、反論したりできますか:
- テンプレート テンプレートの引数は識別子のみであり、修飾されている可能性があります。
- ポイント 1 が正しい場合、これは標準で言及する価値があることは間違いありません。
c++ - テンプレート テンプレート テンプレート パラメータは拡張または標準の一部ですか?
テンプレート テンプレート パラメータに関連する何かを探していたところ、テンプレート テンプレート テンプレート パラメータが標準で許可されていないと主張するこの回答にたどり着きました。
ただし、次のコードは最新の clang (3.2) および最新の GCC (4.8) でコンパイルされます。
これは拡張機能ですか、それとも他の回答は実際には正しくなく、標準で許可されていますか? そうでない場合、省略されている特定の理由はありますか?
c++ - CRTP とテンプレート テンプレート?
テンプレート クラスの CRTP を実行したいのですが、抽象基本クラスに派生クラスのテンプレート パラメーターを認識させたいと考えています。
私はこれを試しましたが、うまくいきません:
g++ 4.6.2 は私に教えてくれます:
何が問題で、そのようなことの良い解決策は何ですか?
c++ - テンプレートのテンプレート パラメータがある場合に allocator::rebind が必要なのはなぜですか?
すべてのアロケーター クラスには、次のようなインターフェイスが必要です。
また、アロケーターを使用するクラスは、次のように冗長なことを行います。
しかし、なぜこれが必要なのですか?
言い換えれば、彼らは次のように言うことができませんでした:
どちらがよりエレガントで、冗長性が低く、(いくつかの同様の状況では) 潜在的に安全ですか?
なぜ彼らはそのrebind
ルートをたどったのT
ですか?
(同様の質問がchar_traits
他にもあります... すべてが を持っているわけではありませんがrebind
、テンプレート テンプレート パラメータの恩恵を受けることができます。)
編集:
ただし、複数のテンプレート パラメーターが必要な場合、これは機能しません。
実際、それは非常にうまく機能します!
vector
がこのように定義されている場合:
次に、次のように言うことができます。
そして、(冗長に) 2回言う必要がなくても、完全にうまく機能します.int
そして、rebind
内部の操作はの代わりにvector
なります。Alloc<Other>
Alloc::template rebind<Other>::other
c++ - MSVC++ コンパイラで enum 仕様のテンプレート テンプレート クラスが失敗する: C3201
コード
これが私の問題のSSCCEの例です:
[編集: に変更LibraryT<MyEnum::Enum, MyEnumTemplate>
しLibraryT<typename MyEnum::Enum, MyEnumTemplate>
ても効果はありません]
エラー
私が望む機能は、列挙型とその列挙型によって特化されたクラスに基づいてライブラリを作成する機能です。上は私の最初の試みです。私はそれが 100% C++ であると信じており、GCC は私をバックアップし、すべてが機能すると言っています。ただし、MSVC++ コンパイラでコンパイルしたいのですが、拒否されます。
質問
MSVC++ コンパイラ [編集: MSVC++ 11 コンパイラ (VS 2012)] を私のコードのようにする方法はありますか? いくつかの追加仕様または別のアプローチのいずれかですか?
可能な (しかし望ましくない) 解決策
列挙型を何らかの整数型 (基になる型) にハード コードします。その後、問題はありません。しかし、私のライブラリは列挙型ではなく積分で動作しています(望ましくないが、機能しています)
c++ - テンプレートの悪用による機能的なC++
テンプレートを使用してC++で機能マップの実装を作成することにしました。これが、私が思いついたものです。
今、これはすべてうまくてダンディであり、コンパイルさえします。問題は、実際にそれをどのように呼ぶのかわからないということです。
素朴な方法を試してみると、次のエラーが発生します。
私の知る限り、すべての議論は正しい。gccは代替案をまったく提案していないので、私のWugMapの定義は疑わしいと思いますが、コンパイルは正常であるため、かなり迷っています。誰かがこの愚かさを通して私を導くことができますか?
誰かが、あらゆるタイプのオブジェクトを含むあらゆるタイプのコレクションの消費をサポートするこのような関数を作成するためのより良い方法を提案できる場合は、それを変更することを検討します。
現在、C ++ 03、gcc4.3.4を使用しているIdeoneを使用しています。
補遺1
これはC++11で可能ですか?そうだとほのめかされています。C ++ 11のテンプレートはさまざまな数の引数をサポートしていることを知っているので、それに合わせて要件を変更します。私は何かを書くことに少し努力しますが、それまでの間、私が探している要件は次のとおりです。
次のような署名が必要です。
これは、参照により、いくつかのデフォルトパラメータで構築された、タイプUの要素を含むコレクションC1を取得し、Uのメンバー関数(Vを返し、未知のタイプのいくつかの引数を取得)を取得し、次に、順序、メンバー関数に渡される引数。この関数は最終的に、タイプVの要素を含み、不明な数のデフォルトパラメーターで初期化されているタイプC2のコレクションを返します。
チェーン可能である必要があります:
/li>テンプレート引数やその他の冗長性を使用する必要がない場合は、ボーナスポイントがあります。
std::transform
素晴らしいですが、連鎖することはできません。