Creación de Manipuladores de Flujos Personalizados
#include <iostream>
#include <iomanip>
// Función de manipulador personalizado
std::ostream& negrita(std::ostream& os) {
return os << "\033[1m";
}
std::ostream& restablecer(std::ostream& os) {
return os << "\033[0m";
}
int main() {
std::cout << negrita << "Formato LabEx" << restablecer << std::endl;
return 0;
}
Implementación de Operadores de Inserción en Flujos
graph TD
A[Formato de Flujos Personalizado] --> B[Sobrecargar el Operador de Inserción]
A --> C[Crear Métodos de Formato Personalizados]
A --> D[Implementar Manipuladores de Flujos]
#include <iostream>
#include <sstream>
#include <iomanip>
class RegistroDeDatos {
private:
std::string nombre;
double valor;
public:
RegistroDeDatos(const std::string& n, double v)
: nombre(n), valor(v) {}
// Operador de inserción en flujo personalizado
friend std::ostream& operator<<(std::ostream& os, const RegistroDeDatos& registro) {
os << std::left << std::setw(15) << registro.nombre
<< std::right << std::setw(10) << std::fixed
<< std::setprecision(2) << registro.valor;
return os;
}
};
int main() {
RegistroDeDatos registro("Temperatura", 98.6);
std::cout << registro << std::endl;
return 0;
}
| Técnica |
Descripción |
Caso de Uso |
| Manipuladores Personalizados |
Crear funciones de formato especializadas |
Formato de salida complejo |
| Manipulación del Buffer de Flujos |
Control directo del buffer |
Operaciones de flujo de bajo nivel |
| Formato Basado en Plantillas |
Soluciones de formato genéricas |
Manejo flexible de tipos |
#include <iostream>
#include <iomanip>
#include <type_traits>
template <typename T>
class SalidaFormateada {
public:
static void imprimir(const T& valor, int ancho = 10) {
if constexpr (std::is_integral_v<T>) {
// Formato de entero
std::cout << std::setw(ancho) << std::hex
<< std::showbase << valor;
} else if constexpr (std::is_floating_point_v<T>) {
// Formato de punto flotante
std::cout << std::setw(ancho) << std::fixed
<< std::setprecision(2) << valor;
} else {
// Formato similar a cadena
std::cout << std::setw(ancho) << std::left << valor;
}
}
};
int main() {
SalidaFormateada<int>::imprimir(255);
std::cout << std::endl;
SalidaFormateada<double>::imprimir(3.14159);
std::cout << std::endl;
SalidaFormateada<std::string>::imprimir("LabEx");
std::cout << std::endl;
return 0;
}
#include <iostream>
#include <functional>
class FormateadorDeFlujos {
public:
// Estrategia de formato flexible
static void formatear(std::ostream& os,
const std::string& datos,
std::function<void(std::ostream&, const std::string&)> formateador) {
formateador(os, datos);
}
};
int main() {
// Formato personalizado basado en lambda
FormateadorDeFlujos::formatear(std::cout, "LabEx",
[](std::ostream& os, const std::string& str) {
os << "[" << str << "]";
});
return 0;
}
Conclusiones Clave
- El formato personalizado proporciona flexibilidad máxima.
- La sobrecarga de operadores permite salidas complejas.
- La metaprogramación de plantillas admite formatos genéricos.
- Los enfoques funcionales permiten estrategias de formato dinámicas.
En LabEx, creemos en empoderar a los desarrolladores con técnicas de formato avanzadas que van más allá de los métodos básicos de salida.