問題タブ [boost-mpl]
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++ - boost::mpl を使用してポリシーを作成する方法は?
次のようなものを使用して、アプリケーションのポリシーを作成しました。
ポリシー クラスは次のようになります。
ポリシーを作成するには:
MyPolicy を使用するには:
彼らが呼び出す場所:
と
基本的に、Cons はここで型リストを作成します。それはかなり簡単です。ただし、typedef の cons 行はちょっと見づらいです。これを行うことができるポリシー コンバイナーがあると理想的です。
任意の数のポリシーを設定できるため、CombinePolicy には C++0x での可変個引数テンプレートのサポートが必要です。これは最先端のコンパイラで実験的にのみ利用可能です。ただし、boost:mpl ライブラリは、一連の前処理のトリックを使用して問題を解決/回避したようです。私は次のようなものを使用できると思います:
そして、次を呼び出します。
次に使用します:
明らかに、ここでsome_magic_lambda_expressionを理解するのに少し苦労しています。ここでは、mpl の専門家にとっては非常に些細なことだと思います。
前もって感謝します。
c++ - boost::mpl::list をトラバースする慣用的な方法は何ですか?
編集:サンプルを編集して、私が抱えている問題によりよく似るようにしました。関数は(テンプレート パラメーターだけでなく)通常のパラメーターに依存するようになりました。これは、コンパイル時に計算を行うことができないことを意味します。
手書きのタイプリストでいくつかのコードを書きましたが、今はブーストmpl
を使い始めており、それをライブラリに移動しようとしています。
のまともなドキュメントが見つからないようでmpl::list
、コードを に移植することさえできていませんboost::mpl
。コードの移植に成功したとしても (仮に?)、それは慣用的なものにはならないと感じています。次のコードの書き方を教えてくださいboost
(これは実際のコードではなく、わざと単純化したものであることに注意してください)。
元のコード (codepad.org 貼り付け)
Boost の使用に失敗しました (codepad.org の貼り付け)
c++ - テンプレート引数のすべての組み合わせで型を生成することは可能ですか?
テンプレート化されたクラスがあります
U
および type 、V
andのいくつかのストック型の実装W
:
テンプレート引数の可能なすべての組み合わせでクラス S をテストしたいのですが、
このような:
唯一の問題は、1 つずつ入力したくない 2 ** 5 ** 5 = 50 の組み合わせがあることです。
s_types
Boost::mpl または Boost.Preprocessorを使用してすべての組み合わせ ( ) を生成する方法はありますか?
ありがとう。
私の最初の失敗した試みを追加しました:
私はインデックス(したがってu_typesなどを定義する)とこのような部分的なテンプレートの特殊化に頼ろうとしていました
それから
すべての S タイプを生成してテストする必要があります。
しかし、私は決定することによってすべての組み合わせをカバーすることができませんでした
1) 適切な特殊化と
2) 構造体 S_Wrapper での再帰性トリガー
私のすべての試行は、実行時に組み合わせを部分的にカバーするか、コンパイル時に推論に失敗しました。
何かご意見は?
解決
Matthieu に触発されて、次のCombine
ような 2 行で目標を達成できるように、テンプレート化されたクラスを考え出しました。
生成されたすべてのタイプを出力します。
コード
c++ - boost :: mpl::bitor_を使用する
boost::mplを使用してポリシークラスのリストを受け入れるクラスがあります。各ポリシークラスには、識別タグが含まれています。MyClassで、各ポリシークラスの識別タグのOR化された結果を生成したいと思います。残念ながら、boost :: mpl ::fold<>機能を正しく使用する方法を理解するのに問題があります。誰か助けていただければ幸いです。
ありがとう、PaulH
c++ - 型リストから継承された型ごとにデフォルト以外のコンストラクターを呼び出すにはどうすればよいですか?
次の方法でポリシー パターンを実装するために、boost typelist を使用しています。
このHost
クラスは、コストのかかる操作である のインスタンスを作成する方法を認識してExpensiveType
おり、各ポリシー クラスはそれを使用する機能を公開しています。ポリシー クラスには常に、次のサンプル ポリシーで定義されたコンストラクターが最小限含まれます。
Host
指定された各ポリシーのコンストラクターを呼び出すような方法でコンストラクターを定義することは可能ですか? タイプ リストが含まれていない場合、各ポリシーのタイプが明示的に知られているため、これは非常に簡単です。
boost::mpl::for_eachアルゴリズムは有望に見えますが、それを使用してこの問題を解決する方法について頭を悩ますことはできません。
c++ - Sun C++ コンパイラと Boost
現在、OpenSolaris 2009-06 で開発しています。Boost::MPL ドキュメントは、sun コンパイラがサポートされていないことを示唆しているようです(ドキュメントは 2004 年に最後に更新されました)。Boost の最上位のドキュメントは、5.10 以降の Sun コンパイラがサポートされていることを示唆しているようです。Sun 5.10 コンパイラの C++ 準拠の状態について詳細を知っている人はいますか?
GCCを使用していつでもコンパイルできました。
c++ - boost::mpl::fold を boost::fusion::map で使用するにはどうすればよいですか?
これをコンパイルしようとすると:
次のエラーが表示されます。
Fusion のドキュメントから: 「Fusion は MPL との完全な互換性を提供します。Fusion シーケンスは MPL シーケンスに完全に準拠しており、MPL シーケンスは Fusion と完全に互換性があります。タイプのみで作業したい場合は、MPL で Fusion シーケンスを使用できます。」
boost::mpl::map を渡すと機能します。
手がかりはありますか?
c++ - boost::mpl for_each と通常の「C」配列
boost::mpl を使用すると、次のような 3 要素ベクトルの typedef を作成できます。
次のスニピットを使用して、この typedef から値を引き出すことができます。
これと同じことを行う方法があるかどうか疑問に思っていますが、. の代わりに通常の 'C' 配列を使用しstd::vector
ます。残念ながら、このプロジェクトでは STL コンテナーを使用できません。
???? を交換する必要があると思います。別の bind 句を使用します。何か案は?
c++ - Boost.MPL と型リストの生成
バックグラウンド
これは、ゲーム エンジンのメモリ マネージャー用です。私はfreelist
実装しており、これらの場合はコンパイル時のリストが必要です。(たとえば、MPL または融合ベクター)。はfreelist
割り当てサイズに対応し、定数より小さいサイズのオブジェクトを割り当て/割り当て解除すると、対応する に移動しfreelist
ます。
結局のところ、これは小さなオブジェクトが一定時間の割り当てと一定時間の割り当て解除をグローバルに償却したことを意味します。(わーい。)
問題
問題は必要な型を生成することなので、最終的には Fusion を使用してそれらの型をインスタンス化する可能性があります。使用されているタイプは次のとおりです (短縮など):
は、最小値から最大値までの 2 のべき乗サイズのfreelist
を管理します。data_block
だから私が欲しいのは:
これを生成するには:
明らかに、これを手動で行うこともできますが、より一般的で微調整可能なインターフェイスのために、それは避けたいと思います。コードでの Fusion ベクターの使用も、ハードコードされたメンバーよりも簡単です。
質問
これについて最善の方法がわかりません。これまで MPL を広範囲に使用したことはありません。何か案は?範囲を作ったり、remove_if
2 の累乗ではないなど、いくつかの悪いアイデアがありましたが、確かにそれは最善ではありません。代わりに、毎回倍増して結果ベクトルにプッシュする再帰的なものでしょうか? どうすればいいのかわかりません。
c++ - テンプレート化されたクラスをデータ型の分類に特化するにはどうすればよいですか?
ブーストを使用しているため、そのライブラリを使用しても問題ありません。
しかし、単一のデータ型に特化するのではなく、データ型のクラス全体に適切な特殊化を提供する一連のテンプレートを作成することに頭を悩ませたことはありません (方法は知っています)。
これを現実のものにするための例を挙げましょう。次のように使用できる一連のクラスが必要です。
ここで、T は単純な基本型、PODS、または配列のいずれかです。クラスには独自のコンストラクターが必要であり、生のメモリを上書きすることはひどい考えであるため、クラスにすることはできません。
基本的に初期化する必要があります memset(&t, 0, sizeof(t)); これにより、従来の構造体を扱うときにランタイム コードがデバッグ コードと変わらないことを確認しやすくなります。
Initialized where SDT = simple data type は、基になる SDT をラッパーし、コンパイラ t() を使用してその型のコンパイラ定義のデフォルト コンストラクタを生成する構造体を単純に作成する必要があります (より洗練されているように見えますが、memset にもなる可能性があります)。単純に t() になります。
POD の場合は Initialized<> を、SDT の場合は Initialized<> を使用して、次のように突き刺します。
SDT の場合:
自然なポインターの動作を提供するために、Initialized を T* に特化しました。そして、要素の型と配列サイズの両方をテンプレート引数として受け取る、配列用の InitializedArray<> があります。しかし、繰り返しになりますが、区別するためにテンプレート名を使用する必要があります.1つの名前(理想的にはInitialized<>)からすべてコンパイル時に正しい特殊化をもたらす単一のテンプレートを提供するのに十分なMPLを理解していません.
オーバーロードされた Initialized<typename T, T init_value> も提供できるようになりたいと思っています。これにより、非スカラー値の場合、ユーザーはデフォルトの初期化値 (または memset 値) を定義できます。
回答に少し手間がかかるかもしれない質問をして申し訳ありません。これは、私自身の MPL の読み取りでは克服できなかったハードルのようですが、おそらくあなたの助けがあれば、この機能を突き止めることができるかもしれません!
以下のベンおじさんの回答に基づいて、次のことを試しました。
そして、いくつかの使用テストを試しました。
これにより、エラーが発生します: *binary '=' : no operator found which takes a right-hand operand of type 'InitializedImpl ' (または受け入れ可能な変換がありません)
一方、(派生型ではなく) 正しい基本型を直接インスタンス化する場合:
これで、古い int として i を使用できます。これは私が欲しいものです!
構造体に対して同じことをしようとすると、まったく同じ問題が発生します。
ご覧のとおり、コンパイラに Initialized をプロモートして真の T のように動作させるように指示する何らかの方法が必要です。
C++ で基本型から継承できる場合は、継承手法を使用するだけで問題ありません。
または、コンパイラに親から子へのすべてのメソッドを外挿するように指示する方法があれば、親で有効なものはすべて子で有効になるため、問題ありません。
または、必要なものを継承する代わりに、MPL または type-traits を typedef に使用できれば、子クラスはなく、伝播の問題もありません。
アイデア?!...