@sbiはすでにコード生成について話していますので、例を挙げておきます。
あなたは多くの項目の列挙を持っていることを言うと、あなたはその要素のそれぞれの機能の束を生成したいと...
一つの解決策は、この複数の包含トリックを使用することです。
// myenumeration.td
MY_ENUMERATION_META_FUNCTION(Item1)
MY_ENUMERATION_META_FUNCTION(Item2)
MY_ENUMERATION_META_FUNCTION(Item3)
MY_ENUMERATION_META_FUNCTION(Item4)
MY_ENUMERATION_META_FUNCTION(Item5)
その後、人々はそうのようにそれを使用する:これは素敵またはハックであるかどうか
#define MY_ENUMERATION_META_FUNCTION(Item_) \
case Item_: return #Item_;
char const* print(MyEnum i)
{
switch(i) {
#include "myenumeration.td"
}
__unreachable__("print");
return 0; // to shut up gcc
}
#undef MY_ENUMERATION_META_FUNCTION
はあなた次第ですが、明らかにすべてのユーティリティ機能を介して時間をクロールする必要がない便利です新しい値が列挙型に追加されます。
私は(これは、しばらく前から、多分それは今変わったのさ)FFTWライブラリにこの特定の使用に遭遇しました。いくつかの関数はin、double、floatなどのさまざまな基底型に対して作成できるように定義されているため、必要な数だけ型を定義してファイルを再インクルードすることができます。しかし、これはCライブラリです。 C++ではもちろんテンプレートを使用しています。 –
@the_mandrill:C++では、テンプレートが問題に合わない状況で実際に使用されています。特にboostプリプロセッサライブラリでは、0,1,2 ... N個の引数を持つ 'boost :: bind'のように、異なる数の引数を使って同じコードを自動的に生成します。 –
@DavidRodríguez:私が理解する限り、boost :: bindは最大9個の引数に対して適切なテンプレートを提供することで実装されています。編集:私は、戻り値の型(戻り値の型がvoidの場合)としてテンプレート引数を持つ関数で 'return x'状況を避けるためにboostを実行する場所を見つけましたが、私はいつも特定のテンプレートの特殊化タイプ 'void'の場合それらはインクルードガードなしでルートに行きますが、この問題を解決するために 'return'マクロを再定義する必要はありません。 – Mephane