Bonjour � tous,

comme mentionner dans le titre j'ai un probl�me de template via un code qui m'a �t� donn� sur ce forum (et que j'ai compl�t�):

j'ai une structure qui d�finit une variable :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
struct var
{
uint64_t val; //valeur de ma variable (oui je stock toujours les valeurs sur 64bits)
unsigned int accessSize //taille de ma variable
unsigned int address //adresse de la variable
unsigned int msb //rang du msb
unsigned int lsb //rang du lsb
}
Et une m�thode template pour lire en m�moire :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
ttemplate <class T>
void read(T& val, const unsigned char* data, int msb, int lsb, bool big_endian=true)
{
    const size_t size = sizeof(T);
    typedef typename unsigned_<size>::type type;
    type *ptr = reinterpret_cast<type*>(&val);
    for(size_t i=0; i<size; ++i)
        ptr[big_endian ? size-i-1: i] = data[i];
    val <<= (sizeof(val) * CHAR_BIT - msb - 1);
    val >>= lsb;
}
Avec cette m�thode on lit de la taille du type qui contient la valeur de la variable et non de l'accessSize de la variable. J'ai donc essay� de refaire cette m�thode template pour avoir ca :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
template <class T>
void readn(T& val, const char* data, int msb, int lsb, int size, bool big_endian=true)
{
    typedef typename unsigned_<size>::type type;
    type *ptr = reinterpret_cast<type*>(&val);
    for(size_t i = 0; i < size; ++i)
        ptr[big_endian ? size - i - 1 : i] = data[i];
    val <<= size * CHAR_BIT - msb - 1;
    val >>= lsb;
}
Mais j'ai eu une erreur de compilation ligne 4 (cannot appear in a constant-expression)
Donc quelqu'un m'a dit de faire ca :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
template <class T, size_t SIZE>
void readn(T& val, const char* data, int msb, int lsb, bool big_endian=true)
{
    typedef typename unsigned_<SIZE>::type type;
    type *ptr = reinterpret_cast<type*>(&val);
    for(size_t i = 0; i < SIZE; ++i)
        ptr[big_endian ? SIZE - i - 1 : i] = data[i];
    val <<= SIZE * CHAR_BIT - msb - 1;
    val >>= lsb;
}
C'est cool ca compile ! Le probleme c'est que qu'on l'appelle comme ca :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    unsigned char data[1];
    data[0] = 127;
 
    var variable;
    variable.val = 0;
    variable.accessSize = 1;
    variable.msb = 7;
    variable.lsb = 0;
    variable.address = 0;
    readn<uint64_t, 1/* EN DUR BERK*/>(variable.val, data, variable.msb, variable.lsb, true);
    return 0;
}
Mais moi je veux pas lire d'une taille �crite en dur mais d'une taille contenue dans une variable !
Une genre de :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
readn<uint64_t>(variable.val, data, variable.msb, variable.lsb, variable.accessSize, true);
//OU
readn<uint64_t, variable.accessSize>(variable.val, data, variable.msb, variable.lsb, true);
Si quelqu'un a une solution, ce serait sympa.
Merci d'avance.