Creo que es un excelente diseño para la década de 1990. Hay tres jerarquías de OOP significativas (las secuencias, las memorias intermedias y las facetas), que usan constantemente el idioma de interfaz no virtual (las funciones de miembros virtuales nunca deberían ser públicas), e incluso usan estructuras de datos inmutables (a los programadores funcionales les encantan) con punteros compartidos reembolsados (los punteros compartidos de propósito general no aprobaron el comité completo en 1994, pero los iostreams los metieron debajo del capó de todos modos).
Los autores de iostreams lograron tomar el desorden gigante de printf / scanf y hacerlo completamente personalizable, exponiendo todo lo que las transmisiones de C hacen detrás de escena. Esto permitió E / S en tipos definidos por el usuario (no puede imprimir un std :: complex) con buffers definidos por el usuario (no puede escanear desde una secuencia TCP), con facetas definidas por el usuario (no puede escanear “a, b, c “para obtener a, byc), con codificaciones por flujo (no se puede imprimir f utf8 en un archivo y gb18030 en otro).
Esto solucionó simultáneamente los problemas de seguridad de tipo de las secuencias C (imprime un doble usando% d y obtienes un comportamiento indefinido) y el problema de rendimiento de tener que analizar la cadena de formato en tiempo de ejecución.
- ¿Cómo debo elegir una pista de informática?
- ¿Cuáles son las implicaciones de la prueba del problema de Turing y cómo ha afectado el campo de la informática hoy en día?
- ¿Qué son los modelos gráficos probabilísticos?
- ¿Cuáles son las aplicaciones de un registro de desplazamiento?
- ¿Cuál es el significado del límite de Gilbert-Varshamov?
Sin embargo, a principios de la década de 1990, comúnmente se creía que la herencia y las funciones virtuales son la única forma verdadera de introducir un comportamiento personalizable, razón por la cual hay llamadas de funciones virtuales involucradas, en cada desbordamiento y desbordamiento del búfer. Además, la lógica de formateo fuera del tiempo de ejecución y en tiempo de compilación se realizó utilizando manipuladores de estado notoriamente detallados (¡pero infinitamente personalizables!), Que a menudo son criticados por hacer que el formateo no predeterminado sea difícil de mantener (y no llega tan lejos como hoy podría, las transiciones de estado todavía se realizan en tiempo de ejecución y de forma secuencial)
Dado lo que hemos aprendido sobre programación en los últimos 15 años … sigue siendo muy difícil hacer una mejor biblioteca de E / S de propósito general. Es fácil mejorar uno en cualquiera (o varios) aspectos, pero no en todos.
PD: aquí hay algunas notas de la reunión del comité de estándares que arrojan ideas para la mejora de iostreams N4412: Deficiencias de iostreams