yo sepa lo que ha cambiado en C++ 0x.
Supongo que fue solo un descuido (teniendo en cuenta que siempre se puede obtener el efecto de especialización parcial con un código más detallado, al colocar la función como miembro static
de una clase).
Puede buscar el DR relevante (Informe de defectos), si lo hay.
EDIT: comprobando esto, me parece que otros también lo han creído, pero nadie puede encontrar tal soporte en el borrador del estándar. This SO thread parece indicar que especialización parcial de plantillas de funciones no es compatible con C++ 0x.
EDIT 2: sólo un ejemplo de lo que quería decir con "la colocación de la función como miembro static
de una clase":
#include <iostream>
using namespace std;
// template<typename T, typename U> void f() {} //allowed!
// template<> void f<int, char>() {} //allowed!
// template<typename T> void f<char, T>() {} //not allowed!
// template<typename T> void f<T, int>() {} //not allowed!
void say(char const s[]) { std::cout << s << std::endl; }
namespace detail {
template< class T, class U >
struct F {
static void impl() { say("1. primary template"); }
};
template<>
struct F<int, char> {
static void impl() { say("2. <int, char> explicit specialization"); }
};
template< class T >
struct F< char, T > {
static void impl() { say("3. <char, T> partial specialization"); }
};
template< class T >
struct F< T, int > {
static void impl() { say("4. <T, int> partial specialization"); }
};
} // namespace detail
template< class T, class U >
void f() { detail::F<T, U>::impl(); }
int main() {
f<char const*, double>(); // 1
f<int, char>(); // 2
f<char, double>(); // 3
f<double, int>(); // 4
}
Por 'plantilla void f (T t, U u) {}' también 'plantilla <> void f (int t, char u) {} 'está permitido. –
dashesy
Me parece interesante que las personas continúen proporcionando soluciones cuando la pregunta no es "¿cómo puedo lograr un objetivo similar" sino "cuál es la razón detrás de este comportamiento" ... Yo mismo no sé la razón de esta elección, pero asumo el comité debe haber tenido una razón para prohibir la especialización parcial de la plantilla de función. Hasta ahora, la explicación "más cercana" es el enlace publicado por Georgy, que solo señala los posibles "riesgos" de la especialización parcial de la plantilla de funciones cuando hay sobrecargas. Sin embargo, no creo que sea una razón para prohibir esta función, así que supongo que hay más en esto ... – bartgol