私はC++アプリケーションをC#に移植し、テンプレート間で実行しています。私はこれらを少し読んで、いくつかのテンプレートは.Netジェネリックに似ていることを理解しています。私はSO answerをよく読んだこのケースに読んだ。C++からC#への移植 - テンプレート
しかし、C++テンプレートのいくつかの使用法はジェネリックに直接関係していないようです。下の例では、WikipediaのTemplate metaprogrammingの記事から、テンプレートは型ではなく値を受け入れるようです。私はこれがどのようにC#に移植されるのかははっきりしていませんか?
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
int x = Factorial<4>::value; // == 24
int y = Factorial<0>::value; // == 1
}
は明らかに、この例のために私は何ができる:
public int Factorial(int N){
if(N == 0) return 1;
return Factorial(N - 1);
}
が、これは関数のリファクタリングではなく、意味的に類似したコードへのポートであることを私には思えます。私はあなたの例がそこに含まれていると思います
:C#のジェネリックとC++テンプレートの違いについては、この記事で
なぜ古典的な再帰関数をC#genericsとして使用しますか?この記事を読むhttp://msdn.microsoft.com/en-us/library/bb549151.aspx Funcの使用について –
nemke
問題は、テンプレートのパラメータとして定数(対型)を使用している可能性はほとんどありませんが、現在のコードベースで使用されている場合は、クラスまたは関数の特殊化と部分的な特殊化が含まれます。特定の例がなければ、答えは幅広く、おそらく本当に有用ではないでしょう。私はその理由でクローズすることに投票しています。あなたが変換に問題があるコードのいくつかについて特別な質問を自由に追加してください。 –
@nemke - この例では、Factorialテンプレートはコンパイル時に展開されるため、実行時に実際には何も行われません。 OPは、多すぎる種類のC#呼び出しに翻訳する必要なしにコードを移植したいので、できるだけジェネリックベースのソリューションが好まれます。残念ながら、そうではありません。 @David - 非常に良い点 –