Bonjour,
Je souhaite utiliser dans mon code, des tableaux statiques constants.
Mon problème est de parcourir ces tableaux : pour cela, il me faut leur taille.
Mon idée première était de créer une méthode template qui me renverrait la taille d'un tableau. Quelque chose comme ça :
Cependant, je ne peux pas appeler cette méthode sans lui fournir i, c'est à dire la taille de mon tableau, c'est à dire précisément ce que je cherche à obtenir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<typename T, int i, T[i]> int GET_ARRAY_SIZE() { return i; };
Je me suis donc rabattu sur un check qui vérifie que mon tableau est bien de la taille que je crois :
que j'utilise comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 template<typename T, int i, T[i]> struct CHECK_ARRAY_SIZE{};
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //------------ header ------------ class A { // mon tableau et sa taille static const float m_MyArray[]; static const int m_iMyArraySize; // une fonction dans laquelle je vais m'en servir void m(); }Tout ceci marche parfaitement bien et compile sauf si je la taille de mon tableau n'égale pas m_iMyArraySize.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //------------ body------------ const int A::m_iMyArraySize = 3; const float A::m_MyArray[] = {2.4F,3.7F,6.2F}; void A::m() { CHECK_ARRAY_SIZE<const float,m_iMyArraySize,m_MyArray> a; }
Mon problème est que je n'arrive pas à l'utiliser avec des tableaux de char*, pour une raison sans doute évidente mais qui m'échappe :
ainsi le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //------------ header ------------ class A { // mon tableau et sa taille static const char* m_MyArray[]; static const int m_iMyArraySize; // une fonction dans laquelle je vais m'en servir void m(); }provoque l'erreur de compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //------------ body------------ const int A::m_iMyArraySize = 4; const char* A::m_MyArray[] = {"joe","jack","william","averell"}; void A::m() { CHECK_ARRAY_SIZE<const float,m_iMyArraySize,m_MyArray> a; }
Je suppose que ça a un rapport avec le fait que si le pointeur est const, la donnée qui pointe ne l'est pas forcément, et donc elle ne peut être évaluée à la compilation, mais je n'arrive pas à trouver comment faire que cela marche.error C2975: 'function-parameter' : argument de modèle non valide pour 'CHECK_ARRAY_SIZE', expression de constante évaluée au moment de la compilation attendue
Quelqu'un aura-t-il une piste pour me sortir d'affaire ?
Merci d'avoir lu ce post,
Merci à ceux qui voudront bien m'aider.
Partager