問題タブ [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++ - 疎結合の暗黙的な変換
暗黙的な変換は、型が意味的に同等である場合に非常に役立ちます。たとえば、同じ型を実装しているが名前空間が異なる 2 つのライブラリがあるとします。または、あちこちのセマンティックシュガーを除いて、ほとんど同じタイプです。関数がテンプレートでない限り、一方の型を他方を使用するように設計された (これらのライブラリの 1 つの) 関数に渡すことはできません。そうでない場合は、何らかの方法で一方の型を他方の型に変換する必要があります。これは些細なことであるはずです (そうでなければ、型は結局のところそれほど同一ではありません!) が、変換を明示的に呼び出すと、ほとんど意味のない関数呼び出しでコードが肥大化します。このような変換関数は実際にはいくつかの値をコピーする可能性がありますが、高レベルの「プログラマー」の観点からは本質的に何もしません。
暗黙の変換コンストラクターと演算子は明らかに役立つ可能性がありますが、それらはカップリングを導入するため、それらの型の 1 つが他の型について知る必要があります。通常、少なくともライブラリを扱う場合はそうではありません。これらのタイプの 1 つが存在すると、他のタイプが冗長になるためです。また、常にライブラリを変更できるとは限りません。
これで、ユーザー コードで暗黙的な変換を機能させる方法について 2 つのオプションが表示されます。
1 つ目は、関連するすべての型に対して変換演算子と変換コンストラクタ (および代入) を実装するプロキシ型を提供し、常にそれを使用することです。
2 つ目は、ライブラリに最小限の変更を加えるだけで済みますが、大きな柔軟性が得られます。外部からオプションで有効にできる、関連する型ごとに変換コンストラクターを追加します。
たとえば、型の場合A
、コンストラクターを追加します。
とテンプレート
デフォルトで暗黙的な変換を無効にします。
次に、2 つの型の間の変換を有効にするために、テンプレートを特殊化します。
convert
ADL で見つけられる機能を実装します。
個人的には、強い反対意見がない限り、2 番目のバリアントを使用することを好みます。
実際の質問に移りましょう: 暗黙的な変換のために型を関連付ける好ましい方法は何ですか? 私の提案は良いアイデアですか?どちらのアプローチにも欠点はありますか? そのような変換を許可することは危険ですか? ライブラリの実装者は、一般に、使用されている可能性が最も高いソフトウェアで型が複製される可能性がある場合に 2 番目の方法を提供する必要があります (ここでは、これらのパッケージのほとんどが 3D を実装する 3D レンダリング ミドルウェアを考えています)。ベクター)。
c++ - boost :: mpl for_eachから抜け出す方法はありますか?
簡単な質問ですが、背景を説明しましょう。
各タイプにIDがmpl::vector
あるタイプがあります。実行時に、を使用しmpl::for_each
てこのベクトルを反復処理し、指定されたIDに一致するタイプを見つけます。しかし、一度見つかったら、ループを続行する意味がないので、質問は、(例外をスローせずに)ループから抜け出す方法はありますか?
c++ - boost::mpl アルゴリズムで std::tuple 型を使用する方法は?
boost::mpl
アルゴリズムはそのままの型では動作しないようです。std::tuple
たとえば、以下はコンパイルされません (boost-1.46.0、g++ スナップショット 2011-02-19):
boost::mpl
アルゴリズムを動作させる最も簡単な方法は何std::tuple
ですか?
- evtl を行います。
boost::fusion
この機能を提供しますか (のようにboost::tuple
)? boost::tuple
そうでない場合、フュージョンの実装をstd::tuple
簡単に引き継ぐことは可能でしょうか?- どちらでもない場合、MPL ドキュメントにリストされている組み込みのメタ関数をすべて実装する必要がありますか、それともどれで十分でしょうか? (ドキュメントには、「組み込みメタ関数の多くは、ほとんどの場合に機能するデフォルトの実装を提供します」としか書かれていませんが、正確にどれが明確ではありません。また、開始と終了を提供するだけのいくつかのテストでは、どこにも導かれませんでした)。
c++ - コンテナ クラスのセットを構成し、ベースからそれらにアクセスする
boost::mpl::inherit_linearly
ユーザーが提供する型を使用してコンテナクラスを作成しようとしています:
私が得るコンパイルエラーは次のとおりです。
Base
によって生成されるタイプのベースであってはなりませんinherit_linearly
か? もしそうならvector<int>
、型階層に a と他のベクトルが表示され、 static_cast が引き出されるべきではありませんか?
この機能を取得する他の方法はありますか?
c++ - mplテクニックを使用してコンストラクターを有効にする方法
私はboost::enable_ifと、それを使ってコンストラクターを切り替える方法に少しこだわっています。
コードは次のとおりです。
アーカイブしたいのは以下です。最初のCtorは、NullTypeが指定されている場合にのみ使用可能である必要があります。他のすべての場合、最初のCtorを無効にし、2番目のCtorを有効にします。
現時点では、コンストラクターの1つが無効であるため、コンパイルエラーが発生します。しかし、どうすればCtorをテンプレート化して、クラステンプレートパラメーターを再利用できますか?
c++ - Boost Fusion/MPL: タイプをシーケンスから同等の any_range のシーケンスに変換します
any_range
Boost を使用して、複数の異種データ範囲を処理したいと考えています。データ範囲のタイプは、Fusion ベクトルとして知られています。次に例を示します。
このような型が与えられた場合、次のような型をさらに派生させるためのテンプレートを書きたいと思います。
は次のようにAnyRange
定義されます。
私は試して失敗しました。これはFusionでも可能ですか?MPL?あるいは、間違った道を進んでいるのかもしれませんany_range
。
c++ - C++ 汎用プログラミングの機微
私が抱えている問題は、次のコードに示されています。
エラー:
私がエミュレートしようとしているパターンは、コード/ビルド レベルでプログラムを拡張することです ( nginxモジュールがコンパイル時に配線される方法とよく似ています)。ビルドに s を追加することで拡張可能 (プラグ可能) な拡張可能なコンパイル時構造を構築する必要があり#include
ます。これにより、すべてのプラグインを含む一意の名前を持つ boost-mpl-vector が生成されます。したがって、が一意の終了名である場合、X_0、X_1、X_2 は、ベクトルに mpl-vectorが適用されているX
ため、途中で構築される名前です。push_back
boost:: preprocessorの抽象化が重要であることはわかっていますが、最終的にコンパイル時にモジュール化されるシステムの一部を試作しているため、まだ調査に時間を費やしたくありません。
というわけで、今後の参考までに
- 上記のエラーが表示されるのはなぜですか?
- 正しい生のプリプロセッサ パターンはどのように見えるべきか。
- 正しいブースト プリプロセッサ ライブラリ パターンはどのように見えますか。
c++ - BOOST_MPL_ASSERT の問題
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)/boost 1.33.1 で正常にコンパイル
前処理後main()
は次のようになります。
なにが問題ですか?
c++ - MPL posは文書化されていないメタ関数ですか?
アルゴリズムのBOOSTMPLドキュメントにfind
は、次のサンプルコードがあります。
ただし、イテレータのpos
メタ関数のドキュメントが見つかりません。確実に使用できますか?
どういうわけか次のように使用したいと思います。
タイプ情報を値自体と一緒にファイルに保存します。
編集
答えてくれたPotatoswatterに感謝します、この解決策はうまくいくようです: