7
votes

Y a-t-il un bon moyen de combiner des manipulateurs de flux?

Si je voulais produire une largeur fixe Numéro hexagonal avec 4 chiffres sur un flux, je devrais faire quelque chose comme ceci: xxx pré>

qui semble un peu long enroulement. Utilisation d'une macro aide: P>

#define HEX(n) "0x" << hex << setw(n) << setfill('0')

cout << HEX(4) << 0xABC;


1 commentaires

Boost a une bibliothèque de format de sortie: voir Stackoverflow.com/Questtions/119098/...


3 Réponses :


4
votes

Pourquoi une macro - Impossible d'utiliser une fonction à la place?

void write4dhex(ostream& strm, int n)
{
    strm << "0x" << hex << setw(4) << setfill('0') << n;
}


0 commentaires

19
votes

Évitez les macros quand vous le pouvez! Ils masquent le code, rendent les choses difficiles à déboguer, ne respectent pas la portée, etc.

Vous pouvez utiliser une fonction simple comme Kene fournie. Si vous voulez obtenir toutes les fantales et flexibles, vous pouvez écrire votre propre manipulateur: P>

template <unsigned int N>
ostream& formatted_hex(ostream& out)
{
    return out << "0x" << hex << setw(N) << setfill('0');
}

int main()
{
    cout << formatted_hex<4> << 123 << endl;
}


7 commentaires

+1 Je préférerais un manipulateur à une fonction libre, car il semble mieux transmettre l'intention. Pour le rendre pleinement générique, écrivez-le sous la forme d'un modèle heex .


@Jon Bon appel! J'ai édité le message en conséquence pour inclure cela comme une possibilité.


Je crois ce que vous avez tapé dans votre premier exemple ne fonctionne pas. Vous devez écrire heex4 (cout) << 123 << endl; .


@RLBond Le code fonctionne mais libre de l'essayer en cas de doute. Ceci est la syntaxe de manipulateur (ENDL elle-même est une fonction qui prend un argument ostream par référence). La raison pour laquelle cela fonctionne est parce que l'opérateur << est déjà surchargé comme ceci: ostream et opérateur << (Ostream &, ostream & (* Funtion_PTR) (OStream &)) . Ainsi, nous pouvons utiliser l'adresse de n'importe quelle fonction qui accepte OStream par référence et renvoie ostream en référence avec l'opérateur d'insertion <<< / code>.


@RLBond, c'est aussi pourquoi le troisième exemple fonctionne (nous transmettons une adresse de fonction à un argument de pointeur de fonction comme opérande droit pour l'opérateur <<). Le deuxième exemple, en utilisant une classe / une structure, n'a pas d'opérateur << déjà surchargé pour nous, et c'est pourquoi nous devons définir un opérateur surchargé << pour celui-là.


Wow, j'ai appris quelque chose de nouveau! Merci! Je pense que vous devriez ajouter cette explication à votre réponse :)


@Rlbond, vous êtes la bienvenu! :-) J'ai ajouté la réponse; Merci pour la suggestion!



1
votes

in c ++ 20 Vous pourrez utiliser STD: : format pour en faire beaucoup moins verbeux: xxx

sortie: xxx

Vous pouvez également facilement réutiliser facilement la chaîne de format en le stockant dans une constante.

Entre-temps, vous pouvez utiliser The {FMT } Bibliothèque , STD :: FORMAT est basé sur. {FMT} fournit également la fonction Imprimer qui rend cela encore plus facile et plus efficace ( Godbolt < / a>): xxx

Disclaimer : Je suis l'auteur de {FMT} et C ++ 20 std :: Format .


0 commentaires