Métodos de salida personalizados
Diseño de interfaces de impresión flexibles
1. Implementación del método toString()
struct Product {
std::string name;
double price;
std::string toString() const {
return "Product[" + name + ", $" +
std::to_string(price) + "]";
}
};
2. Método de salida configurable
class StructPrinter {
public:
enum class Format { COMPACT, VERBOSE, JSON };
template<typename T>
static std::string print(const T& obj, Format format = Format::COMPACT) {
switch(format) {
case Format::COMPACT:
return compactPrint(obj);
case Format::VERBOSE:
return verbosePrint(obj);
case Format::JSON:
return jsonPrint(obj);
}
}
};
Diagrama de flujo del método de salida
graph TD
A[Custom Output Method] --> B[toString()]
A --> C[Configurable Formats]
A --> D[Serialization Techniques]
Comparación de métodos de salida
| Método |
Flexibilidad |
Rendimiento |
Caso de uso |
| Impresión directa |
Baja |
Alta |
Estructuras simples (Simple Structs) |
| toString() |
Media |
Medio |
Depuración (Debugging) |
| Serialización |
Alta |
Baja |
Objetos complejos (Complex Objects) |
3. Enfoque de serialización
struct NetworkConfig {
std::string serialize() const {
std::ostringstream oss;
oss << "{"
<< "\"ip\":\"" << ip_address << "\","
<< "\"port\":" << port
<< "}";
return oss.str();
}
std::string ip_address;
int port;
};
Técnicas avanzadas de impresión
4. Impresión genérica basada en plantillas (templates)
template<typename T>
class GenericPrinter {
public:
static void print(const T& obj, std::ostream& os = std::cout) {
os << "Object Details:" << std::endl;
printMembers(obj, os);
}
private:
template<typename U>
static void printMembers(const U& obj, std::ostream& os);
};
Patrones de desarrollo de LabEx
5. Salida orientada a registro (logging)
struct SystemLog {
std::string getMessage() const {
return "[" + timestamp + "] " + message;
}
std::string timestamp;
std::string message;
int severity;
};
Mejores prácticas
- Mantén los métodos de salida concisos.
- Soporta múltiples formatos de salida.
- Utiliza constantes y referencias.
- Maneja las posibles excepciones.
- Considera las implicaciones en el rendimiento.
Método de salida seguro frente a errores
class SafePrinter {
public:
template<typename T>
static std::string safeToString(const T& obj) {
try {
return obj.toString();
} catch (const std::exception& e) {
return "Printing Error: " + std::string(e.what());
}
}
};
Consideraciones de rendimiento
- Minimiza las asignaciones de memoria.
- Utiliza string_view para referencias no propietarias.
- Prefiere técnicas en tiempo de compilación.
- Almacena en caché los resultados de formatos complejos.