Métaprogrammation : taille d'un tableau
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:
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:
1 2
|
template<typename T, int i, T[i]> struct CHECK_ARRAY_SIZE{}; |
que j'utilise comme ceci :
Code:
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:
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:
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:
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 :
Citation:
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.