MS の T4 Template コード生成システムを C++ コードの生成に適さないものにする問題はありますか?
2 に答える
少し長い答えですが、面白いと思う人もいると思います
T4はC++を生成するのに優れていると思います
C++ には、次のようなメタプログラミングを行うためのツールが既にあると反論する人もいるかもしれません。
プリプロセッサ
プリプロセッサと高次マクロを使用すると、T4 でできることをいくらか達成できますが、T4 にはかなり説得力のある利点がいくつかあると私は言います。
- T4 から生成されたコードは、デバッグと理解が容易です。
- T4 を使用したメタプログラミングは、プリプロセッサを使用した場合よりも簡単です。プリプロセッサは max/min のようなマクロを簡単に実行できますが、モデル駆動型テンプレートについて話すと難しくなります。
- T4 はプリプロセッサよりも強力で、テンプレートの開発を容易にします
- T4 は、ビルド プロセスの一部として、またはオンデマンドで実行できます。
部分的なテンプレートの特殊化
私は部分的なテンプレートの特殊化のトリックが大好きですが、経験から言えば、誰もがそれらを維持するのが好きというわけではありません.
保守性を高めるために、コードの冗長性を減らすよう常に努めてきました。さらに、可能であれば、実行時エラーよりもコンパイル時エラーを好みます。Andrei Alexandrescu による Modern C++ を読んだ後、私は答えを見つけたと思いました。
この本にインスパイアされたコンポーネントを書きましたが、それはうまく機能し、休暇に出かけました。私が戻ってきたとき、チームはコンポーネントを破棄し、従来の手法を使用して独自のコンポーネントを書き直していました。より多くのコードが含まれており、バグが多く、パフォーマンスも良くありませんでしたが、私が作成したコンポーネントに機能を追加する方法を理解できず、これを行う必要があると判断しました。何も救えなかった。これらも賢い人でした。
そうするのは間違っていましたか?保守性に関しては、残念ながら正しい選択をしたと言えます。
この逸話で私が言いたいのは、T4 には部分的なテンプレート特殊化のトリックよりもいくつかの利点があるということです。
- T4 から生成されたコードは、デバッグと理解が容易です。
- T4の方が簡単
- T4はより強力です
- T4 は、ビルド プロセスの一部またはオンデマンドで実行可能
- メンテナーが T4 テンプレートに頭を悩ませることができない場合でも、コードを回収することができます (生成されたコードのメンテナンスを開始し、テンプレートを破棄します)。それは上記の逸話では不可能でした。
もちろん、C++ では、メタプログラミングはプリプロセッサと部分的なテンプレートの特殊化の組み合わせです。
欠点
もちろん、T4 には欠点があります。
- これは、Visual Studio 固有 (または Mono 固有) です。ただし、生成されたコードはもちろん、GCC などでコンパイル可能にすることができます。
- 非標準です
- Visual Studio C++ プロジェクトは T4 をサポートしていないようで、ダミーの .NET プロジェクトを使用してコードを生成する必要があります。
まとめ
全体として、PreProcessor や型システムを使った手の込んだトリックを使用して高度な MetaProgramming C++ を行うことに興味を失い (単純なタスクにはそれらを使用しますが)、最近では T4 に頼っています。
C++ でそれを行う方法のサンプルに興味がある場合は、InteractiveGraphicsをチェックしてください。これは、C#、VB、PowerShell、および SmallBasic で単純なグラフィックスを実行するためのライブラリです。T4 を使用して、すべての API を生成し、.NET と C++ の間でメッセージを渡すためのボイラープレート コードを生成します (回避できる場合は C++/CLI を使用しません)。 all) API を記述するモデルから。新しいメソッドの追加は、モデルを拡張してすべてのテンプレート ファイルを再生成するのと同じくらい簡単です。次に、C++ で抽象メソッドを実装して楽しいことを行います。
C++ コードを含め、任意のテキストを生成できます。