Benutzerdefinierte Ausgabemethoden
Gestaltung flexibler Ausgabe-Schnittstellen
1. Implementierung der toString()-Methode
struct Product {
std::string name;
double price;
std::string toString() const {
return "Product[" + name + ", $" +
std::to_string(price) + "]";
}
};
2. Konfigurierbare Ausgabemethode
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);
}
}
};
Flussdiagramm der Ausgabemethode
graph TD
A[Custom Output Method] --> B[toString()]
A --> C[Configurable Formats]
A --> D[Serialization Techniques]
Vergleich der Ausgabemethoden
Methode |
Flexibilität |
Leistung |
Anwendungsfall |
Direkte Ausgabe |
Niedrig |
Hoch |
Einfache Structs |
toString() |
Mittel |
Mittel |
Fehlersuche |
Serialisierung |
Hoch |
Niedrig |
Komplexe Objekte |
3. Serialisierungsansatz
struct NetworkConfig {
std::string serialize() const {
std::ostringstream oss;
oss << "{"
<< "\"ip\":\"" << ip_address << "\","
<< "\"port\":" << port
<< "}";
return oss.str();
}
std::string ip_address;
int port;
};
Fortgeschrittene Ausgabe-Techniken
4. Generische Ausgabe basierend auf 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);
};
LabEx-Entwicklungsmuster
5. Protokollierungsorientierte Ausgabe
struct SystemLog {
std::string getMessage() const {
return "[" + timestamp + "] " + message;
}
std::string timestamp;
std::string message;
int severity;
};
Best Practices
- Halten Sie die Ausgabemethoden kurz und prägnant.
- Unterstützen Sie mehrere Ausgabeformate.
- Verwenden Sie const und Referenzen.
- Behandeln Sie potenzielle Ausnahmen.
- Berücksichtigen Sie die Auswirkungen auf die Leistung.
Fehlersichere Ausgabemethode
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());
}
}
};
Überlegungen zur Leistung
- Minimieren Sie die Speicherzuweisungen.
- Verwenden Sie string_view für nicht-eigende Referenzen.
- Bevorzugen Sie Compile-Time-Techniken.
- Zwischenspeichern Sie komplexe Formatierungsergebnisse.