Пространства имён
Варианты
Действия

std::stacktrace_entry::source_location

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<tbody> </tbody>
constexpr source_location() noexcept;
(1) (начиная с C++20)
source_location( const source_location& other );
(2) (начиная с C++20)
source_location( source_location&& other ) noexcept;
(3) (начиная с C++20)
1) Создаёт объект source_location с неопределённым значением.
2,3) Конструкторы копирования и перемещения. Не указано, являются ли они тривиальными и/или constexpr.

Параметры

other другой source_location для копирования или перемещения

Пример

#include <iomanip>
#include <iostream>
#include <ranges>
#include <vector>
#include <source_location>
#include <string_view>

// Печатает имя определённого типа в GCC
#if (__GNUG__ >= 11)
template <typename T>
auto type_name_helper(const std::source_location s = std::source_location::current()) {
    using std::operator""sv;
    const std::string_view fun_name{s.function_name()};
    constexpr auto prefix {"[with T = "sv};
    const auto type_name_begin {fun_name.find(prefix)};
    if (""sv.npos == type_name_begin) return ""sv;
    const std::size_t first {type_name_begin + prefix.length()};
    return std::string_view{fun_name.cbegin() + first, fun_name.cend() - 1};
}
template <typename T>
auto type_name() { return type_name_helper<T>(); }
#endif


void print(std::string_view const comment, std::source_location const l) {
    std::cout
        << comment << ":\n"
        << "  file_name     : " << std::quoted(l.file_name()) << '\n'
        << "  function_name : " << std::quoted(l.function_name()) << '\n'
        << "  line          : " << l.line() << '\n'
        << "  column        : " << l.column() << '\n';
}

int main()
{
    constexpr std::source_location default_constructed;
    print("сконструировано по умолчанию", default_constructed);

    constexpr std::source_location current = std::source_location::current();
    print("текущие", current);

#   if (__GNUG__ >= 11)
    const std::vector<std::vector<int>> v{ {1,2}, {3,4,5}, {6} };
    auto jv = std::ranges::join_view(v);
    std::cout
        << '\n'
        << '[' << type_name<int>() << "]\n"
        << '[' << type_name<double*>() << "]\n"
        << '[' << type_name<decltype([](){})>() << "]\n"
        << '[' << type_name<decltype(type_name<int>())>() << "]\n"
        << '[' << type_name<decltype(jv)>() << "]\n"
        ;
#   endif
}

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

сконструировано по умолчанию:
  file_name     : ""
  function_name : ""
  line          : 0
  column        : 0
текущие:
  file_name     : "main.cpp"
  function_name : "int main()"
  line          : 39
  column        : 75

[int]
[double*]
[main()::<lambda()>]
[std::basic_string_view<char>]
[std::ranges::join_view<std::ranges::ref_view<const std::vector<std::vector<int> > > >]

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

[static]
создаёт новый source_location, соответствующий местоположению места вызова
(public static функция-элемент) [править]
создаёт новый stacktrace_entry
(public функция-элемент std::stacktrace_entry) [править]