Я портирую приложение C++ на C# и запускаю шаблоны. Я немного прочитал об этом, и я понимаю, что некоторые шаблоны сродни .Net generics. Я прочитал SO answer в этом случае, который хорошо подвел итог.Портирование C++ на C# - шаблоны
Однако некоторые применения шаблонов C++, похоже, не связаны напрямую с дженериками. В приведенном ниже примере из статьи Википедии 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# generics? Попробуйте прочитать эту статью http://msdn.microsoft.com/en-us/library/bb549151.aspx для использования Func –
nemke
Проблема, скорее всего, не будет связана с константами (против типов) в качестве параметров шаблонов, но с специализации и частичные специализации классов или функций, если они в настоящее время используются в вашей базе кода. Без конкретного примера ответ должен быть широким и, вероятно, не очень полезным. Я голосую, чтобы закрыть по этой причине, не стесняйтесь добавлять конкретные вопросы о какой-то части кода, с которой у вас возникают проблемы с преобразованием. –
@nemke - В этом примере шаблон Factorial расширяется во время компиляции - таким образом, работа во время выполнения не выполняется. OP хочет портировать код, не переведя слишком много на разные типы вызовов C#, поэтому, если возможно, предпочтет решение на основе общего набора. К сожалению, это не так. @David - очень хорошая точка тоже –