std::source_location
| Определено в заголовочном файле <source_location>
|
||
struct source_location; |
(начиная с C++20) | |
Класс std::source_location представляет определённую информацию об исходном коде, такую как имена файлов, номера строк и имена функций. Ранее функции, которые хотели получить эту информацию о месте вызова (для логгирования, тестирования или отладки), должны были использовать макросы, чтобы предопределённые макросы, такие как __LINE__ и __FILE__, раскрывались в контексте вызова. Класс std::source_location представляет собой лучшую альтернативу.
std::source_location соответствует требованиям DefaultConstructible, CopyConstructible, CopyAssignable и Destructible. Lvalue структуры std::source_location соответствует требованию Swappable.
Кроме того, следующие условия равны true:
std::is_nothrow_move_constructible_v<std::source_location>,std::is_nothrow_move_assignable_v<std::source_location>иstd::is_nothrow_swappable_v<std::source_location>.
Предполагается, что std::source_location имеет небольшой размер и может быть эффективно скопирована.
Не указано, являются ли конструкторы копирования/перемещения и операторы присваивания копированием/перемещением структуры std::source_location тривиальными и/или constexpr.
Функции-элементы
Создание | |
создаёт новый source_location со значениями, определёнными реализацией (public функция-элемент) | |
[static] |
создаёт новый source_location, соответствующий местоположению места вызова (public static функция-элемент) |
Доступ к полям | |
| возвращает номер строки, представленный этим объектом (public функция-элемент) | |
| возвращает номер столбца, представленный этим объектом (public функция-элемент) | |
| возвращает имя файла, представленное этим объектом (public функция-элемент) | |
| возвращает имя функции, представленное этим объектом, если таковая имеется (public функция-элемент) | |
Примечание
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_source_location |
|
Пример
#include <iostream>
#include <source_location>
#include <string_view>
void log(const std::string_view message,
const std::source_location location =
std::source_location::current())
{
std::cout << "файл: "
<< 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("Привет мир!");
fun("Привет C++20!");
}
Возможный вывод:
файл: main.cpp(23:8) `int main(int, char**)`: Привет мир!
файл: main.cpp(18:8) `void fun(T) [with T = const char*]`: Привет C++20!
Смотрите также
| изменяет номер строки исходного кода и, необязательно, текущее имя файла (директива предварительной обработки) | |
(C++23) |
представление вычисления в трассировке стека (класс) |