記事の要約(boost :: mplに精通している人向け)、明確にするためにtypenameは省略されています。
a = b; ==> typedef ba;
f(x)==> f <x> ::タイプ
f(x){return x *; } ==> template <typename x> struct x {typedef x * type; };
f()(x)==> f ::適用<x> ::タイプ
a [x] ==> mpl :: at <a、x> ::タイプ
(x?y:z)==> mpl :: if_ <x、y、z> ::タイプ
スイッチ(if_ <x、y、z>)==> * Uff *、一般(デフォルト)および部分的な特殊化
{
case if_ <bool_ <false>、y、z>:yを返します。
デフォルト:zを返す;
}
habrakatの下にいくつかの説明があります:)
誰かが知らない場合、C ++には、型変換を実行できる、少し人工的なメカニズムがあります。
通常の変数xがあり、関数f(x)を適用して別の変数を取得します。
したがって、型でも同じことが可能です。テンプレートメカニズムを使用して、
メタ関数 fをある型xに適用できます。「呼び出し」は次のように実行されます
f<x>::type
。
そして、メタ関数fはテンプレート構造によって記述されます:
テンプレート<typename x>
構造体f
{
typedef x * type;
};
具体的には、このメタ関数は型をその型へのポインターに変換します。
一般に、MPLブーストライブラリは非常に強力なため、タイプコンテナの操作、メタ関数の適用などが可能です。 (もちろん、すべてコンパイル段階で)。
パワフル、もちろん、パワフルですが、次は頭を打ちます
typedef typename detail :: static_find_if <next_type、last_type、
mpl :: bind1 <typename mpl :: lambda <pred_type> :: type、
mpl :: bind1 <mpl :: quote1 <result_of :: value_of>、mpl :: _ 1>
>
>フィルター;
簡単にできます。
なぜこれのためにDSLを作成しないのですか? 特別なプリプロセッサ言語変換
__dsl::mpl { a = f(x); }
__dsl::mpl { a = f(x); }
typedef typename f<x>::type a;
?
そして
__dsl::mpl{ f(x) { return x*; } }
__dsl::mpl{ f(x) { return x*; } }
-そのテンプレート構造内。
つまり __dsl :: mpl {...}の助けを借りて、「ここでこのコードブロックでメタプログラミングを処理します」と言います。 そしてそれをしなさい。 そして、関数呼び出しはメタ関数呼び出しに変わり、割り当てはtypedefに変わります。
はい、追加のコンパイル段階ですが、どこに行きますか? 純粋な形では、人々はこのmplを単に恐れています:)。
一般に、1日で、boost :: spirit 2を使用して、ヘッダーに記載されているほぼすべての構成を実装できました。
変換の基本的なルールは単純です-入力ストリーム内の__dsl :: mpl {...}以外のものはすべて出力に送信され、ブロック内で変換されます。
書くために初期化リストをさらに追加すべきだと思います:
vector my_types = {MainWindow、AboutWindow、ExitWindow};
PSたぶん誰かがVisual Studioでより直感的に統合する方法を教えてくれるでしょうか? エラーを表示するための追加のファイルと行番号を作成しないため。 ああ、夢、夢。