Daily bit(e) C++. std::source_location

Добавлено 30 сентября 2023 в 09:28

Daily bit(e) C++ #235, утилита из C++20 для получения информации о местоположении исходного кода: std::source_location.

Daily bit(e) C++

До 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.

Теги

C++ / CppDaily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.