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 :
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;
};
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.

Je me suis donc rabattu sur un check qui vérifie que mon tableau est bien de la taille que je crois :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
template<typename T, int i, T[i]> struct CHECK_ARRAY_SIZE{};
que j'utilise comme ceci :
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();
}
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;
}
Tout ceci marche parfaitement bien et compile sauf si je la taille de mon tableau n'égale pas m_iMyArraySize.

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();
}
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;
}
provoque l'erreur de compilation :
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
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.

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.