std::stacktrace_entry::source_location
Материал из cppreference.com
<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 функция-элемент) |
(C++23) |
создаёт новый stacktrace_entry (public функция-элемент std::stacktrace_entry)
|