type
Le
Christophe DUVERGER

Bonjour,
Je cherche une macro "maxtype" qui retourne le maximum en sizeof de
plusieurs types:
typedef uint8_t a;
typedef uint16_t b;
typedef maxtype(a,b) c; // équivalent à typedef uint16_t c;
J'ai cherché dans boost, mais rien trouvé d'équivalent, ou bien n'est
pas évalué au compile time.
Merci d'avance
Christophe
Je cherche une macro "maxtype" qui retourne le maximum en sizeof de
plusieurs types:
typedef uint8_t a;
typedef uint16_t b;
typedef maxtype(a,b) c; // équivalent à typedef uint16_t c;
J'ai cherché dans boost, mais rien trouvé d'équivalent, ou bien n'est
pas évalué au compile time.
Merci d'avance
Christophe
template <class T, class U, int n> struct Helper
{
typedef T Type;
};
template <class T, class U> struct Helper <T, U, 0>
{
typedef U Type;
};
template <class T, class U> struct BiggerType
{
enum { T_is_bigger= sizeof (T) > sizeof (U) };
typedef typename Helper <T, U, T_is_bigger>::Type Type;
};
#define maxtype(a_, b_) BiggerType<a_, b_>::Type
Et si tu as besoin du max de plus de deux types :
#define maxtype3(a_, b_, c_)
maxtype (a_, maxtype (b_, c_))
etc.
Spontanément, j'avais pensé à utiliser une union, mais avant le
nouveau standard, ça pose problème avec les types équipés d'un
constructeur (pour des raisons évidentes).
=== 8< === supersizeme.cpp ============================= // c++ -o supersizeme{,.cpp} -Wall -std=c++0x
template <typename T1, typename T2>
union maxsize
{
T1 t1 ;
T2 t2 ;
} ;
struct Big
{
int m1, m2, m3, m4 ;
} ;
int main()
{
return sizeof (maxsize<short, maxsize<Big, char>>) ;
}
=== >8 =================================================
Du coup, avec le type maxsize<Big, char>, il faut appeler le
constructeur et le destructeur manuellement sur le membre ? C'est un
comportement indéfini, ou dépendant de l'implémentation ?
Si je ne m'abuse, ta solution renvoie un type différent de a et b. Sa
taille est correcte, mais ce n'était pas la question.
Le problème initial était :
Comment définis-tu "maxtype" (en utilisant "union") de telle sorte que
maxtype(a,b) soit exactement "uint16_t" ?
Christophe
Han la mauvaise fois :D Tu as habillement éludé LA question :
plusieurs types
C'est vrai que la question n'était pas globalement cohérente. Mais
dans ce cas, maxtype est un nom très mal choisi, la macro devrait
s'appeler BIGGEST_TYPE si on veut effectivement prendre le plus gros type.
Mais dans l'absolu, moi j'avais compris qu'il ne voulait que la
taille, et non le type. Qu'il pensait devoir d'abord déterminer le plus
gros type pour déterminer la taille du plus gros type.
Dans ce cas, c'est trivial :
#define TAILLE_MAX(a,b)
( (sizeof(a)<sizeof(b)) ? sizeof(b) : sizeof(a) )