2012-09-04 10 views
9

Seached für diese, kann aber keine ähnliche Frage finden. Wenn es einen gibt, schließen Sie bitte diese Frage. Diese ist nicht mein richtiger Code, nur ein Beispiel zu demonstrieren: -Partielle Template-Spezialisierung für Arrays

#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; 
} 

Wenn ich kompilieren dieses es nicht Aufruf an die spezielle Version für Arrays. Wenn ich die Vorlage mit

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

Dann ersetzen Sie es tut die Spezialisierung zu nennen, aber ich möchte diese für jede Array aufgerufen wird, nicht nur diejenigen eine specifed Größe. Gibt es eine Möglichkeit, eine Spezialisierung zu schreiben, die für alle Arrays verwendet wird?

+0

Ich bin nicht ganz sicher, aber ich denke, was Sie da geschrieben haben eine Spezialisierung für Arrays von unbekannter Größe ist. Das ist ein unvollständiger Typ, kann aber in einer 'extern'-Deklaration eines Arrays verwendet werden, das von einer anderen TU bereitgestellt wird. –

Antwort

17

Capture the Größe mit einem zusätzlichen nicht-Typ Parameter:

#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 
}