scl-utility

Утилиты для получения имени типа

Извлечение человекочитаемых имён типов на этапе компиляции без RTTI.

Содержание:


type_name

Возвращает полное квалифицированное имя шаблонного типа T на этапе компиляции в виде std::string_view.

Утилита использует специфичные для компилятора макросы для захвата декорированной сигнатуры функции и извлечения точного представления типа.

Семантика

Примеры

#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().


type_short_name

Возвращает только терминальный идентификатор типа T, удаляя все квалификаторы пространств имён и классов.

Описание

Функция обрабатывает результат 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"
}