Преобразование типов
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 intadd_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_cvadd_pointer,add_const,decaycommon_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 — локальная установка не требуется.
Все уроки этого курса
- Исследование типов
- Преобразование типов
- Условная логика
- Создание собственных признаков типов