Namespaces
Variants

std:: source_location

From cppreference.net
Utilities library
Определено в заголовочном файле <source_location>
struct source_location ;
(начиная с C++20)

Класс std::source_location представляет определённую информацию об исходном коде, такую как имена файлов, номера строк и имена функций. Ранее функции, желающие получить эту информацию о месте вызова (для целей логирования, тестирования или отладки), должны были использовать макросы, чтобы предопределённые макросы вроде __LINE__ и __FILE__ раскрывались в контексте вызывающей стороны. Класс std::source_location предоставляет лучшую альтернативу.

std::source_location удовлетворяет требованиям DefaultConstructible , CopyConstructible , CopyAssignable , Destructible и Swappable .

Кроме того, следующие условия являются true :

Предполагается, что std::source_location имеет небольшой размер и может эффективно копироваться.

Не определено, являются ли конструкторы копирования/перемещения и операторы присваивания копированием/перемещением для std::source_location тривиальными и/или constexpr.

Содержание

Функции-члены

Создание
создаёт новый source_location с определёнными реализацией значениями
(public member function)
[static]
создаёт новый source_location соответствующий местоположению точки вызова
(public static member function)
Доступ к полям
возвращает номер строки, представленный этим объектом
(public member function)
возвращает номер колонки, представленный этим объектом
(public member function)
возвращает имя файла, представленное этим объектом
(public member function)
возвращает имя функции, представленное этим объектом, если оно есть
(public member function)

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_source_location 201907L (C++20) Захват информации об исходном коде ( std::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::clog << "file: "
              << location.file_name() << '('
              << location.line() << ':'
              << location.column() << ") `"
              << location.function_name() << "`: "
              << message << '\n';
}
template<typename T>
void fun(T x)
{
    log(x); // line 20
}
int main(int, char*[])
{
    log("Hello world!"); // line 25
    fun("Hello C++20!");
}

Возможный вывод:

file: main.cpp(25:8) `int main(int, char**)`: Hello world!
file: main.cpp(20:8) `void fun(T) [with T = const char*]`: Hello C++20!

Смотрите также

изменяет номер строки исходного кода и, опционально, текущее имя файла
(директива препроцессора)
представление вычисления в stacktrace
(класс)