Sí, puedes. Pero necesitarás cambiar la estructura de la llamada, pero solo un poco.
Específicamente, utilice el patrón de estrategia para reestructurar la implementación de la función de miembro como una clase (que se permite para ser especializada).
Esto está permitido siempre que la clase de estrategia no esté anidada (y, por lo tanto, no depende del tipo de plantilla no especializada).
p. Ej. (Esto probablemente no es sintácticamente correcta, pero la idea debe ser claro)
template <class T>
class OuterThingThatIsNotSpecialized
{
template <class U>
void memberWeWantToSpecialize(const U& someObj_)
{
SpecializedStrategy<U>::doStuff(someObj_);
}
};
template <class U>
struct SpecializedStrategy;
template <>
SpecializedStrategy<int>
{
void doStuff(const int&)
{
// int impl
}
};
template <>
SpecializedStrategy<SomeOtherType>
{
void doStuff(const SomeOtherType&)
{
// SOT impl
}
};
Esto es muy útil porque las llamadas a OuterThingThatIsNotSpecialized para tipos que no existe ninguna aplicación simplemente dejar de compilación.
PS. Incluso puede usar esta estrategia para especializar parcialmente las funciones de la plantilla, algo que de otro modo sería una imposibilidad de C++.
Decepcionante. ¡Gracias por la referencia, sin embargo! –
ISO14882: 1998 La sección 14.7.3, párrafo 16 es la que describe esta situación. – greyfade