問題タブ [template-meta-programming]
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.
compiler-construction - C++0x TMP コンパイル速度
この質問は、テンプレートのメタプログラミング構造に焦点を当てています。私は、c++0x プロトタイプ コンパイラが指数関数的なコンパイル時間を線形コンパイル時間に変えることを示す証拠を提供する 2 つの記事 ( 1と2、2 は確かな証拠を示していませんが、主張を信頼しています) を見つけました。
auto 、 decltype 、および variadic テンプレートには、これを可能にする何かがあるという漠然とした考えがあります。私が見たいのは、言語への変更とこれを可能にするコンパイラ技術の根本的な説明、特にその方法と理由の説明です。
私のスキルレベルに関しては、Boost TMP ライブラリ精神を怒りで使用し、いくつかのおもちゃの MPL プログラムを使用しました。
c++ - C++ での Vector の実装
私は最近、プログラミングの練習として STL Vector の実装を書きました。プログラムはコンパイルされますが、次のような奇妙なエラーが表示されます。
以前にこのエラーを思いついたことがなく、正しく機能させるために実装内で正確に何を変更する必要があるのか わかりません。
誰かが私のコードを見て、この特定のケースで何かが間違っているかどうかを確認できますか? 申し訳ありませんが、具体的には言えません。どこを見ればよいかわかりません。よろしくお願いします。
c++ - C++0xで静的に型付けされたバリアントを作成する
C ++ 0xで静的に型付けされたバリアント(autoのように動作する)を作成できるかどうか疑問に思っています:
vをint以外の値に割り当てると、コンパイルされません。
これまでのところ、私はエレガントな解決策を見つけていません。
c++ - C++でAbstractクラスのすべてのサブクラスをループすることは可能ですか?
いくつかのサブクラスを持つ C++ の抽象クラスがあります。
どういうわけか、マクロまたはテンプレートのメタプログラミングによって、そのようなことを行うことができますか:
c++ - テンプレートタイプのテンプレート化されたテンプレートパラメータリスト
C ++では、次のようなテンプレートテンプレートパラメータを使用できます。
ブール型はtypedefに置き換えることができます(したがって、元の型名が宣言に表示される必要はありません)。
これは完全に機能しますが、次のようにネストされた構造を定義しようとすると、次のようになります。
次に、次のコードはコンパイルに失敗します。
これは標準に準拠した動作ですか、それとも私は何か間違ったことをしていますか?私はMSVS2008を使用しています。
編集:
マイクロソフトのサポートフォーラムにバグレポートを投稿しました:
バグレポート
c++ - このマクロを置き換える
このマクロを考えると
代わりに配列[4]を取るように置き換えたいと思います。醜い MAKE_TYPE('A', 'B', 'C', 'D') の代わりに MAKE_TYPE("ABCD") を書くことができるように
コンパイル時にこれを使用して、いくつかの定数を生成しています。
しかし、このような文字列を渡すのは好きではありません
エラー: 定数式に配列参照を指定することはできません
それはうまくいきませんでした。だから私はテンプレートメタプログラミングを使ってそれを試してみようと思った.
残念ながら、これもうまくいきませんでした。テンプレートに char[4] を入れることができないようです。そして、私はこれらのエラーを受け取ります:
エラー: 's' の前に '>' が必要です エラー: 's' はこのスコープで宣言されていません エラー: 配列参照は定数式に表示できません
どうすればいいですか?
c++ - C++0x のネストされた初期化子リスト
C++0x の新しいイニシャライザ リスト機能を使用して、現在作業中の新しい API のコンパイル時に定義された項目数で std::vector を初期化したいと考えています。このようなもの:
これを達成する方法はありますか?それは可能ですか?TMP と再帰を使用して重複した文字列のリストを作成し、最終的に何らかの方法で定数 (列挙型など) を介してアクセスする必要があることは承知しています。しかし、このように初期化子リストをネストすることさえできないようです。
c++ - C++コンパイル時関数の実行
コードに文字列タグがあり、数値に変換され、タグ値構造の値を検索するために使用されます。
私はこのようなものを持っています:
検索が次のように定義されている場合:
すべてのtimeタグはコンパイル時に一定であるため、タグを数値に変換する呼び出しを検索関数から削除したいと思います。テンプレート( http://en.wikipedia.org/wiki/Compile_time_function_execution )を使用してコンパイル時にいくつかの単純な関数を実行できることは知っていますが、nullで終了する文字列を繰り返し処理して中間値を保持する方法が正確にはわかりません。テンプレート内。nullで終了する文字列を繰り返し、パブリック変数に文字を追加する簡単なサンプルを教えてください。
c++ - テンプレートのブースト MPL リスト
クラス テンプレートのリスト、T 1、T 2、... T Nを取得し、クラスの MPL リストのリストを作成します。各テンプレートは同じパラメーターでインスタンス化されます。
boost::mpl::list
テンプレート テンプレート パラメーターのリストでは使用できません。通常の型パラメーターのみです。
したがって、以下は機能しません。
どうすればそれを機能させることができますか?
c++ - クラステンプレートのインスタンス化をその基本クラステンプレートと比較すると、is_same は false を返しますか?
*編集: どういうわけか、コンパイラがasを作成していると思ったので、継承/派生に関係なく、is_same がそれらをどのように評価するかについての私の仮定につながりました。私の悪い:(その後の誤解については申し訳ありません:\ *B
A<int, int, string>
カスタムタイプをチェックするためにいくつかのメタ関数を作成し、この問題に遭遇しましたが、ここで何が起こっているのかわかりません。既知の型の this_t メンバーを、渡されたパラメーターの this_t と比較することで回避できると思いますが、1 番目と 3 番目の is_same テストが失敗する理由を理解したいだけです。
is_same はA<...>
ベースによって差別化されていますか? A<int, int, string>
との明らかな違いは何B
ですか?