2009-12-09 4 views
2

Dans le code C++ ci-dessous, la fonction de vérification de modèle donne une sortie qui n'est pas ce que je voudrais: 1 au lieu de 3. Je soupçonne que K est mappé à int*, pas à int[3] (est-ce un type?). Je voudrais qu'il me donne la même sortie que la deuxième fonction (non modélisée), à ​​laquelle je donne explicitement la taille du tableau ...Comment un modèle peut-il connaître la taille du tableau donné en tant qu'argument de modèle?

En utilisant des macros, est-il possible d'écrire une fonction de vérification? cela accepte un seul argument mais connaît toujours la taille du tableau?

#include <iostream> 
using namespace std; 

int data[] = {1,2,3}; 

template <class K> 
void Check(K data) { 
    cout << "Deduced size: " << sizeof(data)/sizeof(int) << endl; 
} 

void Check(int*, int sizeofData) { 
    cout << "Correct size: " << sizeofData/sizeof(int) << endl; 
} 

int main() { 
    Check(data); 
    Check(data, sizeof(data)); 
} 

Merci. PS: Dans le code réel, le tableau est un tableau de structures qui doit être itéré pour les tests unitaires.

+0

Mieux vaut utiliser un vecteur std :: à la place d'un tableau. –

+2

Dans votre code d'origine, le type 'K' dégénère en pointeur lorsque vous passez un tableau à' Check'. C'est un comportement C/C++ normal, avec ou sans gabarits impliqués. Heureusement, C++ fournit un mécanisme pour préserver la taille du tableau, en utilisant une constante intégrale comme paramètre de modèle. Voir la réponse d'Alexey Malistov pour plus de détails. –

Répondre

10
template<class T, size_t S> 
void Check(T (&)[S]) { 
    cout << "Deduced size: " << S << endl; 
} 
+0

pouvez-vous l'expliquer s'il vous plaît? – UnKnown

Questions connexes