No hay especializaciones parcial de la función plantillas, y se especializan en parte un miembro de lo que necesita primero especializarse en parte la plantilla de clase.
template< typename _T, size_t num >
struct Foo {
void Func() {
printf("Hello world!");
}
};
template< typename _T >
struct Foo< _T, 1 > {
void Func() {
printf("Hi!");
}
};
Ahora, si Foo
también contiene métodos distintos de Func
cuya aplicación es independiente del valor de num
, y que no quieren duplicar su aplicación en la especialización de Foo
, se puede aplicar el siguiente patrón:
template< typename _T, size_t num >
struct FooFuncBase {
void Func() {
printf("Hello world!");
}
};
template< typename _T >
struct FooFuncBase< _T, 1 > {
void Func() {
printf("Hi!");
}
};
template< typename _T, size_t num >
struct Foo : public FooFuncBase< _T, num > {
void OtherFuncWhoseImplementationDoesNotDependOnNum() {
...
}
};
O, usando CRTP:
template< typename _Derived, typename _T, size_t num >
struct FooFuncBase {
void Func() {
static_cast< _Derived* >(this)->OtherFuncWhoseImplementationDoesNotDependOnNum();
printf("Hello world!");
}
};
template< typename _Derived, typename _T >
struct FooFuncBase< _Derived, _T, 1 > {
void Func() {
static_cast< _Derived* >(this)->OtherFuncWhoseImplementationDoesNotDependOnNum();
printf("Hi!");
}
};
template< typename _T, size_t num >
struct Foo : public FooFuncBase< Foo< _T, num >, _T, num > {
void OtherFuncWhoseImplementationDoesNotDependOnNum() {
printf("Other");
}
};
Me gusta esta solución. ¡Incluso aprendí algo sobre la convención de nombres de C++! Sin embargo, ¿cómo hago esto si tengo, por ejemplo, cualquier cantidad de especializaciones para varios valores de num junto con un retroceso en caso de que ninguno de ellos funcione? –
@wowus, respuesta actualizada –
Gracias, aceptada. –