Estoy portando una aplicación C++ a C#, y me he encontrado con plantillas. He leído un poco sobre esto, y entiendo que algunas plantillas son similares a los genéricos .Net. Leí el SO answer en este caso que lo resumió muy bien.Portando C++ a C# - plantillas
Sin embargo, algunos usos de la plantilla C++ no parecen estar directamente relacionados con los genéricos. En el siguiente ejemplo del artículo de Wikipedia Template metaprogramming, la plantilla parece aceptar un valor, en lugar de un tipo. No estoy muy seguro de cómo esto se transporta a 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
}
Es evidente que para este ejemplo que podía hacer:
public int Factorial(int N){
if(N == 0) return 1;
return Factorial(N - 1);
}
pero esto me parece ser una refactorización a una función, en lugar de un puerto de código semánticamente similar.
¿Por qué usarías una función recursiva clásica como genéricos C#? Intente leer este artículo http://msdn.microsoft.com/en-us/library/bb549151.aspx para utilizar Func –
nemke
El problema probablemente no sea con las constantes (frente a los tipos) como parámetros de las plantillas, sino con especializaciones y especializaciones parciales de clases o funciones si se usan actualmente en su base de códigos. Sin algún ejemplo particular, la respuesta deberá ser amplia y probablemente no sea realmente útil. Voy a votar para cerrar por esa razón, siéntase libre de agregar preguntas específicas sobre algún fragmento de código que tenga problemas para convertir. –
@nemke: en este ejemplo, la plantilla Factorial se expande en tiempo de compilación, por lo que no se realiza ningún trabajo en tiempo de ejecución. El OP quiere portar el código sin tener que traducir demasiado en diferentes tipos de llamadas C#, por lo que preferiría una solución genérica si es posible. Lamentablemente, no lo es. @David - punto muy bueno también –