質問

MSのT4テンプレートコード生成システムがC ++コードの生成に適さない可能性がある問題はありますか?

役に立ちましたか?

解決

C ++コードを含む、必要なテキストを生成できます。

他のヒント

少し長い答えですが、面白いと思う人もいるかもしれません

T4はC ++の生成に優れていると思います

C ++には、次のようなメタプログラミングを行うためのツールが既に備わっていると反論する人もいます。

プリプロセッサ

プリプロセッサと高次マクロを使用すると、T4でできることをいくらか達成できますが、T4にはかなり説得力のある利点があると言います。

  1. T4から生成されたコードはデバッグと理解が容易です
  2. T4を使用したメタプログラミングは、プリプロセッサを使用した場合よりも簡単です。プリプロセッサはmax / minなどのマクロを簡単に実行できますが、モデル駆動型テンプレートについて話すときは難しくなります
  3. T4はプリプロセッサよりも強力で、テンプレートの開発が容易になります
  4. T4は、ビルドプロセスまたはオンデマンドの一部として実行できます

部分テンプレートの特化

テンプレートの部分的な特殊化のトリックは大好きですが、経験から言えば、誰もがそれを維持するのが好きというわけではありません。

私は常に、保守性を高めるために、コードの冗長性を減らすよう努めました。さらに、可能な場合は実行時エラーよりもコンパイル時エラーを優先します。 Andrei AlexandrescuによるModern C ++を読んだ後、答えを見つけたと思いました。

この本にインスパイアされたコンポーネントを作成し、それが素晴らしく機能したので、休暇に入りました。私が戻ってきたとき、チームはコンポーネントを破棄し、従来の手法を使用して独自に書き直しました。より多くのコードが含まれており、バグが多く、パフォーマンスも低下しましたが、作成したコンポーネントに機能を追加する方法がわかりませんでした。何も回収できませんでした。これらも賢い人でした。

彼らはそうするのは間違っていましたか?保守性の観点からは、残念なことに彼らは正しい選択をしたと言います。

この逸話の私のポイントは、T4が部分的なテンプレートの特殊化トリックよりもいくつかの利点があることです:

  1. T4から生成されたコードはデバッグと理解が容易です
  2. T4の方が簡単です
  3. T4はより強力です
  4. T4は、ビルドプロセスまたはオンデマンドの一部として実行できます
  5. メンテナーがT4テンプレートに頭を悩ませることができれば、コードをサルベージできます(生成されたコードのメンテナンスを開始し、テンプレートを破棄します)。上記の逸話では不可能でした。

もちろん、C ++メタプログラミングでは、プリプロセッサと部分テンプレートの特殊化の組み合わせです。

欠点

T4にはもちろん欠点があります;

  1. これはVisual Studio固有(またはMono固有)です。ただし、生成されたコードはもちろんGCCや他のユーザーがコンパイルできるようにすることができます。
  2. 非標準です
  3. 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 ++で抽象メソッドを実装し、楽しいことをします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top