Ежедневный бит(е) 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,
// Tip: to capture source location at caller site, 
//      use default argument:
    std::source_location caller = std::source_location::current()) {
    std::clog << "[" << caller.file_name()  // Filename
        << ":" << caller.line()             // Line number
        << "/" << caller.column()           // Column number
        << "] " << caller.function_name()   // 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.