quiero especializar una plantilla de clase con la siguiente función:especialización de plantilla con un tipo a plantillas
template <typename T>
class Foo
{
public:
static int bar();
};
La función no tiene argumentos y debe devolver un resultado basado en el tipo de Foo. (En este ejemplo de juguete, volvemos el número de bytes del tipo, pero en la aplicación real que queremos volver algún objeto meta-datos.) La especialización funciona para tipos totalmente especificadas:
// specialization 1: works
template <>
int Foo<int>::bar() { return 4; }
// specialization 2: works
template <>
int Foo<double>::bar() { return 8; }
// specialization 3: works
typedef pair<int, int> IntPair;
template <>
int Foo<IntPair>::bar() { return 2 * Foo<int>::bar(); }
Sin embargo, Me gustaría generalizar esto a tipos que dependen de (otros) parámetros de plantilla en sí mismos. Adición de las siguientes especialidades da un error en tiempo de compilación (VS2005):
// specialization 4: ERROR!
template <>
template <typename U, typename V>
int Foo<std::pair<U, V> >::bar() { return Foo<U>::bar() + Foo<V>::bar(); }
Estoy asumiendo que esto no es legal C++, pero ¿por qué? ¿Y hay una manera de implementar este tipo de patrón elegantemente?
Tenga en cuenta, sin embargo, que no es necesario ningún especializaciones para devolver el tamaño de T : 'static int Foo() {return sizeof (T); } ' Me pregunto si ese tipo de patrón podría no ayudar con su problema real. – UncleBens