2010-11-05 4 views
1

C définit diverses règles concernant la promotion d'entier, voici un great answer décrivant comment cela fonctionne.Promotion d'entier, C++ et modèles

Dans GCC vous pouvez le faire:

#define max(a,b) \ 
    ({ __typeof__ (a) _a = (a); \ 
     __typeof__ (b) _b = (b); \ 
    _a > _b ? _a : _b; }) 

qui évaluera la valeur maximale du type déterminé par les règles de C comme ci-dessus.

En utilisant std::min ou std::max en utilisant des types mixtes, il est nécessaire de fournir le type approprié de jeter comme un paramètre de modèle:

size_t const subcount = std::min<Offset>(count, treecap - offset); 

Pour obtenir un min/max qui permet d'évaluer le type selon le C règles de promotion d'entier, il serait nécessaire de savoir comment les types se rapportent, et quel serait le type résultant, pour chaque combinaison de types d'entrée gauche et droite. Je souhaite effectuer un min/max, avec le même comportement que l'échantillon C sous GCC donné ci-dessus, et avec la même promotion (assurant ainsi le même comportement que dans GCC). Comment puis-je faire cela en C++ et/ou MSVC?

Notez que immédiatement après avoir effectué ce min/max "naturel", je serai numeric_cast dans la plage de taille attendue.

+1

Êtes-vous à la recherche peut-être [un modèle 'promote'] (http://stackoverflow.com/questions/2426330/uses- de-ac-arithmétique-promotion-en-tête/2450157 # 2450157)? –

+0

@ James McNellis: Oui quelque chose comme ça –

Répondre

1

Il y a une très bonne mise en œuvre ici que je l'ai utilisé pour divers projets: http://www.oonumerics.org/blitz/traits.html

+1

Dommage que cela ne fasse pas partie du standard C++, mais cela ne me surprend guère. Le C++ ne peut pas se soucier de la compatibilité avec C et vit dans un pays désagréable. –