std::source_location
| definiert in Header <source_location>
|
||
struct source_location; |
||
Die Klasse source_location liefert eine Reihe von Informationen über den Quellkode wie z.B. Dateiname, Zeilennummer und Funktionsnamen.
Vor C++20 mußten Funktionen, die Informationen über den Quellkode an der Stelle des Aufrufs benötigten (z.B. fürs Protokollieren, Testen oder Fehlersuchen), Makros benutzen wie __LINE__ und __FILE__, die an der Aufrufstelle expandiert wurden.
Die Klasse source_location stellt eine bessere Alternative dar.
Die Klasse source_location erfüllt die Anforderungen für DefaultConstructible, CopyConstructible, CopyAssignable und Destructible.
Ein lokalisierbarer Wert (lvalue) von source_location erfüllt zusätzlich die Anforderungen für Swappable.
Zusätzlich sind folgende Bedingungen
std::is_nothrow_move_constructible_v<std::source_location>,std::is_nothrow_move_assignable_v<std::source_location>andstd::is_nothrow_swappable_v<std::source_location>
erfüllt.
Es ist erstrebenswert, daß source_location eine geringe Größe hat und effizient kopiert werden kann.
Es ist undefiniert, ob der Kopier- und Verschiebekonstruktor und die Kopier- und Verschiebezuweisungsoperatoren von source_location trivial oder constexpr sind.
Methoden
Erzeugung | |
erzeugt ein neues Objekt von source_location mit implementationsabhängigen Werten (öffentliche Elementfunktion) | |
[statisch] |
erzeugt ein neues Objekt vom Type source_location mit korrekten Werten für die Aufrufstelle (public static Elementfunktion) |
Wertezugriff | |
| gibt die Zeilennummer zurück (öffentliche Elementfunktion) | |
| gibt die Spaltennummer zurück (öffentliche Elementfunktion) | |
| gibt den Dateiname zurück (öffentliche Elementfunktion) | |
| gibt den Funktionsnamen zurück (öffentliche Elementfunktion) | |
Beispiel
#include <iostream>
#include <string_view>
#include <source_location>
void log(const std::string_view message,
const std::source_location location =
std::source_location::current())
{
std::cout << "file: "
<< location.file_name() << "("
<< location.line() << ":"
<< location.column() << ") `"
<< location.function_name() << "`: "
<< message << '\n';
}
template <typename T> void fun(T x)
{
log(x);
}
int main(int, char*[])
{
log("Hello world!");
fun("Hello C++20!");
}
Possible output:
file: main.cpp(23:8) `int main(int, char**)`: Hello world!
file: main.cpp(18:8) `void fun(T) [with T = const char*]`: Hello C++20!
