portage d’ostream :: opfx / osfx d’Unix vers Linux

Je porte du code C ++ d’Unix vers Linux (Red Hat).

J’ai rencontré le modèle suivant:

ostream& myfunction(ostream& os) { if (os.opfx()) { os << mydata; os.osfx(); } return os; } 

Les fonctions opfx et osfx ne sont pas disponibles sous Red Hat 4.5. J’ai vu une suggestion ici d’utiliser la fonctionnalité ostream::sentry :

 ostream& myfunction_ported(ostream& os) { ostream::sentry ok(os); if (ok) { os << mydata; } return os; } 

Je vois d’ ici que le but d’ opfx est de vérifier l’état du stream avant de le opfx et de continuer.

Mes questions:

Je pensais que les fonctions ostream vérifiaient déjà l’état du stream avant de travailler sur le stream. Est-ce vrai? N’était-ce pas vrai à un moment donné?

Remplacer opfx par sentry nécessaire? Qu’est-ce que la sentry me donne cet operator<< ne me donne pas déjà?

Tout inséreur existant (à moins que ce soit vraiment horriblement bogué) est déjà en train de créer un object sentinelle, aussi longtemps que vous faites votre travail via une inséreuse existante, vous n’avez pas besoin de créer vous-même un object sentinelle.

Vous devez créer un object sentinelle lorsque vous écrivez vos données directement dans le tampon de stream, sans l’aide d’une inséreuse existante (par exemple, lorsque vous n’utilisez rien d’autre qui crée une sentinelle pour vous).

Pour ce code, vous pouvez simplement éviter de créer complètement les objects sentinelles et faire quelque chose comme:

 ostream& myfunction(ostream& os) { return os << mydata; } 

Notez que le code existant a été déclaré pour retourner un ostream & , mais ne semble rien retourner.