問題タブ [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.
c++ - MPL をブーストして、オブジェクトのシリアライゼーション用のコードを生成しますか?
のシリアライゼーション/デシリアライゼーション コードを生成したい
mpl シーケンスを見て、オブジェクトを識別して取得できるようにする必要があります。メンバーの名前を取得する方法がわかりません。それを知る必要がありますか?
コードは次のようになります
オブジェクトのレイアウトに対応する mpl シーケンスを定義するだけで上記のコードを生成したいのですが、実行できますか?ヒントを教えてください。
私の目的は:
mpl::vector<String, int, long, char>
ユーザーが上記のオブジェクトを定義すると、metaprogram
必要なコードを生成できます。
c++ - boost::mpl::vector - 型のベース オフセットを取得する
mpl::vector
aを実行した後に a のオフセットを取得することは可能mpl::find<seq,type>
ですか?
別の言い方をすれば、次のコンパイル時間に相当するものを実行したいと考えています。
これに失敗すると、私の型にmpl::vector
はtype_trait<T>::ordinal
const がハードコーディングされています。可能であればこれを避けたいと思います。
重要な注意、私はboost::variant
ベクトルからも作成しています。ランタイム関数を実行することで序数を取得できることがわかりますvariant::which()
。ただし、これには、デフォルトで初期化された値でダミー オブジェクトを作成する必要があります。これはかなり醜いです。バリアントでそれを行う他の方法を知っていれば、それも私の問題の解決策になります。
c++ - boost-mpl比較イテレータ
おやおや、mplライブラリを操作するとき、構文を理解することは当たり前の経験です(前の質問)。2つのmplitteratorを比較するための正しい構文、つまりit != v.end()
テストは何ですか?
アサーションを削除すると、ファンクターはコンパイルされて正常に実行されます。
c++ - より精神的な狂気 - パーサーの種類 (rules vs int_parser<>) とメタプログラミング技術
質問は一番下に太字で示され、問題は最後に蒸留コードの断片によって要約されています。
型システム (型システムは型から文字列へと型から文字列へ) を単一のコンポーネント (Lakos で定義されている) に統合しようとしています。これを達成するために、、、boost::array
およびboost::variant
を使用しています。boost::mpl
型のパーサーとジェネレーターのルールをバリアントに統合したいと考えています。未定義の型、int4 (下記参照) 型、および int8 型があります。バリアントは次のように読み取りますvariant<undefined, int4,int8>
。
int4 の特徴:
上記のバリアントは未定義として開始し、その後ルールを初期化します。問題が発生し、50 ページのエラーが発生しましたが、最終的に追跡することができました.Variant はoperator=
割り当て中に使用され、aboost::spirit::qi::int_parser<>
は別のもの (operator=) に割り当てることができません。
対照的に、未定義の型に問題はありません。
問題の抽出:
具体的なパーサーとルールの間にはセマンティック ギャップがあります。私の脳は現在喫煙しているので、実用主義について考えるつもりはありません.私の質問は、どうすればこの問題を解決できるでしょうか? この問題を解決するための 3 つのアプローチを考えることができます。
one:静的関数メンバー:
アプローチ1はスレッドセーフコードを防ぐと思いますか? ?
2:統合パーサーは shared_ptr にラップされます。私が型付けシステムの TMP に悩まされている理由は 2 つあります。ポインターを使用すると、最初の理由が無効になります。
3: operator= は no-op として定義されています。lhs
バリアントは、割り当て前にデフォルトで構築されることを保証します。
編集: オプション3が最も理にかなっていると思います(operator =はノーオペレーションです)。ルール コンテナが作成されると変更されず、タイプのルール トレイトをそのオフセットに強制的に割り当てるだけです。
c++ - std::map の std::map を再帰的に作成する
このようなことを行うための最良の方法またはより良い方法を知りたいです:
c++ - 可変個引数テンプレートパラメータパックを抽出し、型特性メタ関数の別の可変個引数テンプレートで使用しますか?
可変個引数クラステンプレートが別のクラスのベースであるかどうかを確認したいと思います。通常はstd::is_base_ofを使用しますが、私のユースケースは適切ではないと思います。また、これを処理するためのstdまたはboostにすでに何かがあるかどうかはわかりません。可変個引数の基本クラステンプレートのパラメータパックを別の可変個引数のクラステンプレートから取得したいと思います。これが私がやりたいことをうまく説明するいくつかのサンプルコードです:
使用法:
根性:
これは可能ですか?
c++ - C++ メタプログラミングで状態を保存しますか?
C++ メタプログラムに状態を格納することは可能ですか? 私が何を意味するのか完全にはわかりませんが、「割り当て」可能なテンプレート クラスが必要です。たとえばstate::value
、C++ テンプレートを使用して変更できます。
私はおそらく非常に曖昧に聞こえるかもしれませんが、誰かが私が話していることを理解してくれることを願っています (また、Boost.MPL はご遠慮ください)。
c++ - パラメーター パック テンプレート メタプログラミングの深さ優先検索
私は次のようなパラメータクラスを持っています:
そして、私はパラメータパッククラスを持っています:
parameter_packs
parameters
および/またはの数が含まれていますparameter_packs
。
次のような関数 (またはメソッド) が必要です。
parameter
値を持ち、KEY
その値を返す最初のものに対して深さ優先トラバーサルを行います。もちろん、これはコンパイル時に実行する必要があり、一定の実行時間を持つ必要があります。KEY
これは単なる空のクラスであり、作成も使用もされないことに注意してください。
これを左からでも右からでもできるようにしたいです。
アイデアは、変数に保存して関数に渡す前にオーバーライドできる一連のデフォルトパラメーターを持つことができるということです。boost::parameter は保存を許可しないと思います(一時変数への参照のため)。パラメーターを2倍にするとエラーが発生すると思います。
c++ - C++でジェネリッククラスにtypedefを使用する方法
unordered_mapを使用しようとしています。ただし、一部のサーバーにはtr1ライブラリがありません。そのような場合は地図を使いたいです。そこで、次のいずれかの行を使用するヘッダーファイルを作成します。
私の問題は、ここでさまざまなタイプのマップを使用していることです。
typedefを使用してマップまたはunordered_mapをハッシュマップとしてエイリアスできる場合は、コードでマップをとして使用できhashmap<string, string>
ますhashmap<int, int>
。
これを行う方法はありますか、またはもっと良い方法があれば私に提案してください。
ありがとうVinod
c++ - テンプレート クラス定義にネストされた C++ テンプレート型
次のようなクラス定義がある状況があります。
私は gnu g++ でコンパイルしていますが、コンパイラは Alpha は「テンプレートではありません」と不平を言っています。
Bravo が作成されたライブラリで使用されているのと同じ手法を見たことがありますが、Bravo はテンプレート化されたクラスです。何か不足していますか?Alpha を骨の髄まで取り除き、テストを行ったが、コンパイルは成功しなかった。また、ブラボーのライブラリでこれが機能しているのを見た場所からコードをコピーして貼り付けようとしましたが、同じことが成功せず、同じエラーが発生しました。
前もって感謝します。