[excusez moi, clavier US]
Bonjour a tous,
Je travaille sur la realisation d'une bibliotheque de mathematique vectoriel pour simplifier les ecritures des calculs, et j'utilise des bitfields anonymes dans des templates de strutures dont le type est determiner en meta programing pour sauter un nombre d'octet bien precis dans une structure. Je m'explique ...
Ici ce trouve la partie meta programming, simplement pour determiner un type integer a partir de son sizeof :
github - /src/cmath_typedefs.h
Ensuite je fait dans un template par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 template <int ADDRESS_SIZE> struct MetaTypedef { typedef int32_t intX_t; typedef uint32_t uintX_t; typedef float32_t floatX_t; }; template <> struct MetaTypedef<1> { typedef int8_t intX_t; typedef uint8_t uintX_t; }; // and so on ...
github - /src/cmath_vec3.subs.h
Ce qui me permet l'ecriture de vec4_t
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template <typename TYPE> struct vec_xnyz { TYPE x; typename MetaTypedef <sizeof(TYPE)>::uintX_t : sizeof(TYPE) * 8; // on saute sizeof(TYPE) octets TYPE y; TYPE z; // fonctions };
github - /src/cmath_vec4.h
Cela fonctionne a merveille lorsque je fait ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 template <typename TYPE> struct vec4_t { union { struct { TYPE x; TYPE y; TYPE z; TYPE w; }; // [ ... ] vec_xnyz <TYPE> xzw; // [ ... ] }; // fonctions };
Mais si sizeof(TYPE) > 8 octets comme par exemple pour une matrice 4x4 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 vec4_t <int32_t> a; vec4_t <double> b; a.zxy = vec3_t<int32_t> (b.xzw);
J'obtiens a la compilation sous clang :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 vec4_t <vec4_t <double> > matrix; // ...
Ce qui est normal car je n'ai pas de specialisation de MetaTypedef pour ADDRESS_SIZE = sizeof(vec_xnyz <double>) = 32 car uint256_t n'existant pas. De plus ce message est tres bizar car dans mon cas, la valeur dans le bit field anonyme n'a aucune importance, donc qu'elle soit tronquee sur 32 bits a aussi aucune importance. Hors j'ai pour habitude de compiler en mode release avec un -Werror, donc je doit me debarasser de ce warning absolument.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 warning: size of anonymous bit-field (256 bits) exceeds size of its type; value will be truncated to 32 bits
Quelqu'un aurait il une solution ?
Merci bien !
PS:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 > clang++ --version Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.0.0 Thread model: posix
Partager