Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

type

6 réponses
Avatar
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; // =E9quivalent =E0 typedef uint16_t c;

J'ai cherch=E9 dans boost, mais rien trouv=E9 d'=E9quivalent, ou bien n'est
pas =E9valu=E9 au compile time.

Merci d'avance

Christophe

6 réponses

Avatar
Fabien LE LEZ
On Mon, 25 Jul 2011 13:34:09 -0700 (PDT), Christophe DUVERGER
:

Je cherche une macro "maxtype" qui retourne le maximum en sizeof de
plusieurs types:



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.
Avatar
Mickaël Wolff
On 07/26/11 04:09, Fabien LE LEZ wrote:
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;
};



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 ?
Avatar
Fabien LE LEZ
On Tue, 26 Jul 2011 06:59:06 +0200, Mickaël Wolff
:

j'avais pensé à utiliser une union



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 :

typedef uint8_t a;
typedef uint16_t b;

typedef maxtype(a,b) c; // équivalent à typedef uint16_t c;



Comment définis-tu "maxtype" (en utilisant "union") de telle sorte que
maxtype(a,b) soit exactement "uint16_t" ?
Avatar
Christophe DUVERGER
Merci pour cette solution.

Christophe
Avatar
Mickaël Wolff
On 07/26/11 07:26, Fabien LE LEZ wrote:
Le problème initial était :

typedef uint8_t a;
typedef uint16_t b;

typedef maxtype(a,b) c; // équivalent à typedef uint16_t c;



Comment définis-tu "maxtype" (en utilisant "union") de telle sorte que
maxtype(a,b) soit exactement "uint16_t" ?



Han la mauvaise fois :D Tu as habillement éludé LA question :

Je cherche une macro "maxtype" qui retourne le maximum en sizeof de




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.
Avatar
Fabien LE LEZ
On Wed, 27 Jul 2011 10:21:05 +0200, Mickaël Wolff
:

moi j'avais compris qu'il ne voulait que la taille, et non le type.



Dans ce cas, c'est trivial :

#define TAILLE_MAX(a,b)
( (sizeof(a)<sizeof(b)) ? sizeof(b) : sizeof(a) )