Daily bit(e) C++. std::source_location
Daily bit(e) C++ #235, утилита из C++20 для получения информации о местоположении исходного кода: std::source_location
.
До C++20 получение информации о местоположении исходного кода (строка, файл, функция) требовало использования (иногда непереносимых) макросов.
std::source_location
– это небольшая утилита C++20, которая инкапсулирует информацию о местоположении исходного кода в классе C++. Обратите внимание, что возвращаемые значения по-прежнему определяются реализацией.
#include <source_location>
#include <string>
#include <iostream>
// Совет: чтобы зафиксировать местоположение исходного кода
// на вызывающей стороне, используйте аргумент по умолчанию:
void logger(std::string message,
std::source_location caller = std::source_location::current())
{
std::clog << "[" << caller.file_name() // Имя файла
<< ":" << caller.line() // Номер строки
<< "/" << caller.column() // Номер столбца
<< "] " << caller.function_name() // Имя функции
<< " \"" << message << "\"\n";
}
int main(int, char*[])
{
logger("hello");
// [/app/example.cpp:15/11] int main(int, char**) "hello"
[](){ logger("lambda"); }();
// [/app/example.cpp:18/17] main(int, char**)::<lambda()> "lambda"
struct X
{
X() { logger("constructor"); }
~X() { logger("destructor"); }
} var;
// [/app/example.cpp:22/21] main(int, char**)::X::X() "constructor"
// [/app/example.cpp:23/22] main(int, char**)::X::~X() "destructor"
}
Открыть пример на Compiler Explorer.