Erstellen benutzerdefinierter Stream-Manipulatoren
#include <iostream>
#include <iomanip>
// Benutzerdefinierte Manipulatorfunktion
std::ostream& fett(std::ostream& os) {
return os << "\033[1m";
}
std::ostream& zurücksetzen(std::ostream& os) {
return os << "\033[0m";
}
int main() {
std::cout << fett << "LabEx Formatierung" << zurücksetzen << std::endl;
return 0;
}
Implementieren von Stream-Einfügeoperatoren
graph TD
A[Benutzerdefinierte Stream-Formatierung] --> B[Einfügeoperator überladen]
A --> C[Benutzerdefinierte Formatierungsmethoden erstellen]
A --> D[Stream-Manipulatoren implementieren]
#include <iostream>
#include <sstream>
#include <iomanip>
class Datensatz {
private:
std::string name;
double wert;
public:
Datensatz(const std::string& n, double v)
: name(n), wert(v) {}
// Benutzerdefinierter Stream-Einfügeoperator
friend std::ostream& operator<<(std::ostream& os, const Datensatz& datensatz) {
os << std::left << std::setw(15) << datensatz.name
<< std::right << std::setw(10) << std::fixed
<< std::setprecision(2) << datensatz.wert;
return os;
}
};
int main() {
Datensatz datensatz("Temperatur", 98.6);
std::cout << datensatz << std::endl;
return 0;
}
Technik |
Beschreibung |
Anwendungsfall |
Benutzerdefinierte Manipulatoren |
Spezialisierte Formatierungsfunktionen erstellen |
Komplexe Ausgabeformatierung |
Stream-Puffermanipulation |
Direkte Pufferkontrolle |
Stream-Operationen niedriger Ebene |
Vorlagenbasierte Formatierung |
Generische Formatierungslösungen |
Flexible Typbehandlung |
#include <iostream>
#include <iomanip>
#include <type_traits>
template <typename T>
class FormatierteAusgabe {
public:
static void ausgeben(const T& wert, int breite = 10) {
if constexpr (std::is_integral_v<T>) {
// Ganzzahlformatierung
std::cout << std::setw(breite) << std::hex
<< std::showbase << wert;
} else if constexpr (std::is_floating_point_v<T>) {
// Fließkommaformatierung
std::cout << std::setw(breite) << std::fixed
<< std::setprecision(2) << wert;
} else {
// Formatierung für Zeichenketten
std::cout << std::setw(breite) << std::left << wert;
}
}
};
int main() {
FormatierteAusgabe<int>::ausgeben(255);
std::cout << std::endl;
FormatierteAusgabe<double>::ausgeben(3.14159);
std::cout << std::endl;
FormatierteAusgabe<std::string>::ausgeben("LabEx");
std::cout << std::endl;
return 0;
}
#include <iostream>
#include <functional>
class StreamFormatter {
public:
// Flexible Formatierungsstrategie
static void formatieren(std::ostream& os,
const std::string& data,
std::function<void(std::ostream&, const std::string&)> formatter) {
formatter(os, data);
}
};
int main() {
// Lambda-basierte benutzerdefinierte Formatierung
StreamFormatter::formatieren(std::cout, "LabEx",
[](std::ostream& os, const std::string& str) {
os << "[" << str << "]";
});
return 0;
}
Wichtige Erkenntnisse
- Benutzerdefinierte Formatierung bietet maximale Flexibilität.
- Operatorüberladung ermöglicht komplexe Ausgaben.
- Template-Metaprogrammierung unterstützt generische Formatierung.
- Funktionale Ansätze ermöglichen dynamische Formatierungsstrategien.
Bei LabEx glauben wir an die Stärkung von Entwicklern mit fortschrittlichen Formatierungstechniken, die über grundlegende Ausgabemethoden hinausgehen.