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.
Mieux vaut utiliser un vecteur std :: à la place d'un tableau. –
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. –