Création d'un flux d'entrée à partir d'une mémoire constante : surmonter la restriction d'altération des données
Pour résoudre le problème de la lecture de données à partir d'une mémoire tampon constante sans en le modifiant, il est nécessaire de créer un tampon de flux personnalisé. Ceci peut être réalisé en définissant une classe qui hérite du standard std::streambuf et remplace ses fonctions pertinentes.
Plus précisément, la classe membuf définie ci-dessous sert de tampon de flux :
struct membuf: std::streambuf { membuf(char const* base, size_t size) { char* p(const_cast<char*>(base)); this->setg(p, p, p + size); } };
Cette classe configure le tampon de flux avec le tampon de données fourni et sa taille, définissant essentiellement la plage de données à lire.
Pour créer un flux d'entrée basé sur cela buffer, nous définissons la classe imemstream, qui hérite à la fois de membuf et de std::istream:
struct imemstream: virtual membuf, std::istream { imemstream(char const* base, size_t size) : membuf(base, size) , std::istream(static_cast<std::streambuf*>(this)) { } };
Cette classe enveloppe essentiellement le tampon de flux personnalisé et fournit les fonctionnalités d'un flux d'entrée. Désormais, il est possible d'utiliser imemstream comme flux d'entrée régulier :
imemstream in(data, size); in >> value;
En utilisant cette technique, on peut lire les données d'une mémoire tampon constante comme si elles provenaient d'un flux, résolvant ainsi efficacement le problème d'origine. tout en conservant l'immuabilité des données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!