0Pricing
C++ Academy · Урок

Преобразование типов

remove_const, decay и другие средства

«Преобразование типов» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Преобразования типов

Помимо запросов, <type_traits> может создавать новые типы на основе существующих. Эти характеристики предоставляют тип-член ::type, для которого в C++14 и более новых версиях есть сокращение _t.

Удаление константности

std::remove_const_t<const int> даёт int. Это полезно, когда нужна изменяемая версия типа.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::remove_const_t<const int>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

Удаление ссылки

std::remove_reference_t<int&> даёт int. Это основа идеальной передачи и написания обобщённого кода.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::remove_reference_t<int&>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

Добавление указателя и константности

Преобразования также добавляют квалификаторы.

  • add_const_t<int> = const int
  • add_pointer_t<int> = int*
#include <iostream>
#include <type_traits>

int main() {
    using P = std::add_pointer_t<int>;
    std::cout << std::is_same_v<P, int*> << "\n";
    return 0;
}

Сведение типа

std::decay_t<T> имитирует преобразования, происходящие при передаче по значению: убирает ссылки и квалификаторы константности и изменчивости, а массивы и функции преобразует в указатели.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::decay_t<const int&>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

Сведение массива

decay превращает тип массива в указатель, точно так же как при передаче массива функции.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::decay_t<int[5]>;
    std::cout << std::is_same_v<T, int*> << "\n";
    return 0;
}

Удаление квалификаторов типа

std::remove_cv_t<const volatile int> снимает оба квалификатора — const и volatile, — получая обычный int.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::remove_cv_t<const volatile int>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

Общий тип

std::common_type_t<A,B> даёт тип, к которому можно преобразовать оба типа, например тип результата выражения a + b.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::common_type_t<int, double>;
    std::cout << std::is_same_v<T, double> << "\n";
    return 0;
}

Базовый тип перечисления

Для перечислений std::underlying_type_t<E> показывает целочисленный тип, лежащий в основе перечисления.

#include <iostream>
#include <type_traits>

enum class Color : unsigned char { Red, Green };

int main() {
    using U = std::underlying_type_t<Color>;
    std::cout << std::is_same_v<U, unsigned char> << "\n";
    return 0;
}

Цепочки преобразований

Преобразования можно объединять. Чтобы нормализовать переданный тип, часто сочетают несколько преобразований, например remove_cv_t<remove_reference_t<T>>, с чего по сути и начинается decay.

Зачем нужны преобразования

Обобщённые функции часто получают const T& или T&&, но для объявления локальных переменных или возвращаемых значений им нужен базовый тип. Характеристики преобразований предоставляют этот тип в чистом виде.

Быстрая проверка

Вспомните, что делает сведение типа.

Повторение

Вы изучили преобразования типов.

  • Характеристики предоставляют ::type с сокращением _t
  • remove_const, remove_reference, remove_cv
  • add_pointer, add_const, decay
  • common_type, underlying_type для получения производных результатов

Часто задаваемые вопросы

Урок «Преобразование типов» бесплатный?

Да — полный текст урока «Преобразование типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Преобразование типов»?

remove_const, decay и другие средства Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Преобразование типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Исследование типов
  2. Преобразование типов
  3. Условная логика
  4. Создание собственных признаков типов
← Назад к C++ Academy