std::remove_cv, std::remove_const, std::remove_volatile
Материал из cppreference.com
| Defined in header <type_traits>
|
||
| template< class T > struct remove_cv; |
(1) | (начиная с C++11) |
| template< class T > struct remove_const; |
(2) | (начиная с C++11) |
| template< class T > struct remove_volatile; |
(3) | (начиная с C++11) |
Предоставляет определение типа в члене type, которое будет таким же как и T, исключая то, что его самый верхний cv-квалификатор будет удалён.
1) Удаляет самый верхний const, самый верхний volatile, или оба, если они были
2) Удаляет самый верхний const
3) Удаляет самый верхний volatile
Содержание |
[править] Типы-члены
| Имя | Определение |
type
|
Тип T без cv-квалификатора
|
[править] Вспомогательные типы
| template< class T > using remove_cv_t = typename remove_cv<T>::type; |
(начиная с C++14) | |
| template< class T > using remove_const_t = typename remove_const<T>::type; |
(начиная с C++14) | |
| template< class T > using remove_volatile_t = typename remove_volatile<T>::type; |
(начиная с C++14) | |
[править] Возможная реализация
template< class T > struct remove_cv { typedef typename std::remove_volatile<typename std::remove_const<T>::type>::type type; }; template< class T > struct remove_const { typedef T type; }; template< class T > struct remove_const<const T> { typedef T type; }; template< class T > struct remove_volatile { typedef T type; }; template< class T > struct remove_volatile<volatile T> { typedef T type; }; |
[править] Пример
Удаление const/volatile из const volatile int * не изменяет тип, так как сам указатель не имеет ни const, ни volatile квалификатора.
Запустить этот код
#include <iostream> #include <type_traits> int main() { typedef std::remove_cv<const int>::type type1; typedef std::remove_cv<volatile int>::type type2; typedef std::remove_cv<const volatile int>::type type3; typedef std::remove_cv<const volatile int*>::type type4; typedef std::remove_cv<int * const volatile>::type type5; std::cout << "test1 " << (std::is_same<int, type1>::value ? "успешно" : "неудачно") << '\n'; std::cout << "test2 " << (std::is_same<int, type2>::value ? "успешно" : "неудачно") << '\n'; std::cout << "test3 " << (std::is_same<int, type3>::value ? "успешно" : "неудачно") << '\n'; std::cout << "test4 " << (std::is_same<const volatile int*, type4>::value ? "успешно" : "неудачно") << '\n'; std::cout << "test5 " << (std::is_same<int*, type5>::value ? "успешно" : "неудачно") << '\n'; }
Вывод:
test1 успешно test2 успешно test3 успешно test4 успешно test5 успешно
[править] См. также
| (C++11) |
Проверяет содержит ли тип в себе квалификатор const или нет (шаблон класса) |
| (C++11) |
Проверяет содержит ли тип в себе квалификатор volatile или нет (шаблон класса) |

