ブースト用DSL :: MPL、f(x)をf ::タイプに変換

記事の要約(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でより直感的に統合する方法を教えてくれるでしょうか? エラーを表示するための追加のファイルと行番号を作成しないため。 ああ、夢、夢。



All Articles