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