Извлечение человекочитаемых имён типов на этапе компиляции без RTTI.
#include <scl/utility/meta/type.h>Содержание:
Возвращает полное квалифицированное имя шаблонного типа T на этапе компиляции в виде
std::string_view.
Утилита использует специфичные для компилятора макросы для захвата декорированной сигнатуры функции и извлечения точного представления типа.
#include <scl/utility/meta/type.h>template <typename T> constexpr std::string_view type_name() noexcept;struct , class или union для пользовательских
типов (например, "struct MyStruct"). GCC и Clang эти ключевые слова не добавляют.
Используйте type_short_name<T>(), если нужно нормализованное имя без префикса.std::vector<int>).constexpr, что позволяет использовать результат
в статических утверждениях и других контекстах этапа компиляции.#include <scl/utility/meta/type.h>
#include <vector>
#include <string>
using ::scl::type_name;
struct MyStruct {};
// Фундаментальные типы
static_assert(type_name<int>() == "int");
// Типы стандартной библиотеки
// Примечание: точная строка может незначительно отличаться в зависимости от реализации STL
static_assert(type_name<std::string>().find("basic_string") != std::string_view::npos);
// Пользовательские типы
// GCC/Clang: "MyStruct" | MSVC: "struct MyStruct"
static_assert(type_name<MyStruct>().find("MyStruct") != std::string_view::npos);
// Шаблонные типы
static_assert(type_name<std::vector<MyStruct>>().find("vector<MyStruct>") != std::string_view::npos);
Генерация человекочитаемых логов, сообщений об ошибках в обобщённом коде или реализация
легковесных систем рефлексии, где идентификаторы типов необходимо отображать или сравнивать
в виде строк без накладных расходов typeid(T).name().
Возвращает только терминальный идентификатор типа T, удаляя все квалификаторы пространств
имён и классов.
#include <scl/utility/meta/type.h>template <typename T> constexpr std::string_view type_short_name() noexcept;Функция обрабатывает результат type_name<T>() и удаляет всё до последнего разделителя ::.
Дополнительно срезаются префиксы struct/class/union/enum (присутствующие на MSVC)
и шаблонные аргументы, поэтому результатом всегда является только голый идентификатор.
#include <scl/utility/meta/type.h>
namespace app::core { struct Task {}; }
int main() {
constexpr auto full = scl::type_name<app::core::Task>(); // "app::core::Task" (GCC/Clang)
constexpr auto short_n = scl::type_short_name<app::core::Task>(); // "Task"
}