2012-09-04 10 views
9

Acusado para esto, pero no puede encontrar una pregunta similar. Si hay uno, cierre esta pregunta. Esto no es mi verdadero código, sólo un ejemplo para demostrar: -Especialización de plantillas parciales para matrices

#include <iostream> 

// Normal template class with a destructor 
template <class T> class Test 
{ 
public: 
    ~Test() { std::cout << "Normal \n";} 
}; 

// Partial specialization for arrays 
template<class T> class Test<T[]> 
{ 
public: 
    ~Test() { std::cout << "Array \n"; } 
}; 


int main() 
{ 
    Test<int[3]> i; 
} 

Cuando compilo esto no llamada la versión especializada para las matrices. Si se sustituye la plantilla con

template<class T> class Test<T[3]> 
{ 
public: 
    ~Test() { std::cout << "Array \n"; } 
}; 

Entonces hace llamar la especialización pero quiero que esto se detiene por cualquier variedad no sólo los de un tamaño specifed. ¿Hay alguna forma de escribir una especialización que se utilice para todas las matrices?

+0

no estoy del todo seguro, pero creo que lo que ha escrito no es una especialización para las matrices de tamaño desconocido. Es un tipo incompleto, pero se puede usar en una declaración 'extern' de una matriz que proporcionará alguna otra TU. –

Respuesta

17

el tamaño de captura con un parámetro de no-tipo adicional:

#include <iostream> 

template <class T> class Test 
{ 
public: 
    ~Test() { std::cout << "Normal \n";} 
}; 

template<class T, size_t N> class Test<T[N]> 
{ 
public: 
    ~Test() { std::cout << "Array " << N << '\n'; } 
}; 

int main() 
{ 
    Test<int[3]> i; // Array 3 
    Test<int[5]> j; // Array 5 
} 
Cuestiones relacionadas