Przenoszę aplikację C++ do C# i uruchamiam szablony. Czytałem trochę na ten temat i rozumiem, że niektóre szablony są podobne do generycznych .Net. Przeczytałem SO answer dla tej sprawy, która ładnie podsumowała to.Przenoszenie C++ do C# - szablony
Jednak niektóre zastosowania szablonu C++ nie wydają się być bezpośrednio związane z rodzajami. W poniższym przykładzie z artykułu Wikipedii Template metaprogramming szablon wydaje się akceptować wartość, a nie typ. Nie jestem całkiem pewien, jak to byłoby przeniesione do 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
}
Oczywiście dla tego przykładu mogę zrobić:
public int Factorial(int N){
if(N == 0) return 1;
return Factorial(N - 1);
}
ale wydaje mi się być refaktoryzacji do funkcji, a nie port semantycznie podobny kod.
Dlaczego używałbyś klasycznej funkcji rekursywnej jako generics C#? Spróbuj przeczytać ten artykuł http://msdn.microsoft.com/en-us/library/bb549151.aspx dla korzystania z Func –
nemke
Najprawdopodobniej problem nie będzie związany ze stałymi (vs. typami) jako parametrami do szablonów, ale z specjalizacje i częściowe specjalizacje klas lub funkcji, jeśli są one aktualnie używane w bazie kodu. Bez jakiegoś szczególnego przykładu odpowiedź będzie musiała być szeroka i prawdopodobnie mało przydatna. Głosuję za zamknięciem z tego powodu, nie krępuj się dodawać szczegółowe pytania dotyczące jakiegoś fragmentu kodu, w którym masz problemy z konwersją. –
@nemke - W tym przykładzie szablon Factorial rozwija się w czasie kompilacji - w ten sposób żadna praca nie jest wykonywana w czasie wykonywania. OP chce przenieść kod bez konieczności tłumaczenia zbyt wiele na różne typy wywołań C# - wolałby więc, jeśli to możliwe, rozwiązanie generyczne. Niestety tak nie jest. @David - bardzo dobry punkt też –