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.