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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #23604611
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.
Mickaël Wolff
Le #23604691
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 ?
Fabien LE LEZ
Le #23604751
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" ?
Christophe DUVERGER
Le #23605211
Merci pour cette solution.

Christophe
Mickaël Wolff
Le #23607581
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.
Fabien LE LEZ
Le #23607701
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) )
Publicité
Poster une réponse
Anonyme