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.