T4テンプレート-C ++コードの生成に適していますか?
-
08-07-2019 - |
質問
MSのT4テンプレートコード生成システムがC ++コードの生成に適さない可能性がある問題はありますか?
解決
C ++コードを含む、必要なテキストを生成できます。
他のヒント
少し長い答えですが、面白いと思う人もいるかもしれません
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プロジェクトを使用してコードfrmoを生成する必要があります。
まとめ
全体として、PreProcessorまたは型システムで高度なトリックを使用して高度なMetaProgramming C ++を実行することに興味を失い(単純なタスクにも使用しています)、最近ではT4に依存しています。
C ++でそれを行う方法のサンプルに興味がある人は、 InteractiveGraphics をご覧ください。 C#、VB、PowerShell、SmallBasic用のライブラリで、シンプルなグラフィックスを実行します。そこで、T4を使用して、.NETとC ++の間でメッセージを渡すためのすべてのAPIとボイラープレートコードを生成します(回避できる場合はC ++ / CLIは使用しませんall)APIを記述するモデルから。新しいメソッドを追加するのは、モデルを拡張してすべてのテンプレートファイルを再生成するのと同じくらい簡単です。次に、C ++で抽象メソッドを実装し、楽しいことをします。