Il y a quelques jours, j'ai décidé qu'il serait amusant d'écrire une sous-classe streambuf
qui utiliserait mmap
et une lecture anticipée. J'ai regardé comment mon STL (SGI) mis en œuvre filebuf
et s'est rendu compte que basic_filebuf
contient un FILE*
. Donc, hériter de basic_filebuf
est hors de question.Dérivation de streambuf sans réécrire un flux correspondant
J'ai donc hérité de basic_streambuf
. Ensuite, je voulais lier mon mmapbuf
à un fstream.
Je pensais que la seule chose que je devrais faire serait de copier l'interface implicite de filebuf
... mais c'était une erreur évidente. Dans le SGI, basic_fstream
possède un basic_filebuf
. Peu importe si j'appelle basic_filestream.std::::ios::rdbuf(streambuf*)
, le flux de fichiers l'ignore complètement et utilise son propre filebuf
.
Alors maintenant, je suis un peu confus ... bien sûr, je peux créer mon propre mmfstream
, ce serait le copier/coller exact du fstream
mais cela ne semble pas vraiment orienté vers le DRY.
Ce que je ne comprends pas, est la suivante: pourquoi ne fstream
est si étroitement lié à filebuf
, de sorte qu'il est impossible d'utiliser quoi que ce soit d'autre qu'un filebuf
? Tout le point de séparer les flux et les bufs est que l'on peut utiliser un flux avec un tampon différent.
Solutions:
=>filestream
doit reposer sur l'interface implicite de filebuf
. Autrement dit, fstream devrait être modélisé par une classe streambuf. Cela permettrait à chacun de fournir sa propre sous-classe streambuf à fstream
tant qu'il implémente l'interface implicite de filebuf
. Problème: nous ne pouvons pas ajouter de paramètre de modèle à fstream
, car il briserait les sélecteurs de gabarit tout en utilisant fstream
comme paramètre de modèle de gabarit.
=>filebuf
devrait être une classe virtuelle pure sans aucun attribut supplémentaire. De sorte que l'on peut en hériter sans porter tout son fICHIER *.
Vos idées sur le sujet?
Vous avez une faute de frappe dans le sujet; streambug => streambuf. Je ne connais pas la réponse à votre question, désolé! – chrism1
Corrigé, merci :) – NewbiZ