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

Source: https://habr.com/ru/post/J86651/


All Articles