std::remove_cv, std::remove_const, std::remove_volatile
Von cppreference.com
| Definiert in der Kopfdatei <type_traits> |
||
| template< class T > struct remove_cv; |
(1) | (seit C++11) |
| template< class T > struct remove_const; |
(2) | (seit C++11) |
| template< class T > struct remove_volatile; |
(3) | (seit C++11) |
Stellt den Member-Typedef type bereit, der mit T identisch ist, außer dass seine obersten cv-Qualifizierer entfernt werden.
1) Entfernt das oberste const, oder das oberste volatile, oder beides, falls vorhanden.
2) Entfernt das oberste const.
3) Entfernt das oberste volatile.
Wenn das Programm Spezialisierungen für eine der auf dieser Seite beschriebenen Vorlagen hinzufügt, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Member-Typen
| Name | Definition |
type
|
der Typ T ohne cv-Qualifizierer |
[bearbeiten] Hilfstypen
| template< class T > using remove_cv_t = typename remove_cv<T>::type; |
(seit C++14) | |
| template< class T > using remove_const_t = typename remove_const<T>::type; |
(seit C++14) | |
| template< class T > using remove_volatile_t = typename remove_volatile<T>::type; |
(seit C++14) | |
[bearbeiten] Mögliche Implementierung
template<class T> struct remove_cv { typedef T type; }; template<class T> struct remove_cv<const T> { typedef T type; }; template<class T> struct remove_cv<volatile T> { typedef T type; }; template<class T> struct remove_cv<const volatile T> { typedef T 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; }; |
[bearbeiten] Beispiel
Das Entfernen von const/volatile von const volatile int* ändert den Typ nicht, da der Zeiger selbst weder const noch volatile ist.
Führen Sie diesen Code aus
#include <type_traits> template<typename U, typename V> constexpr bool same = std::is_same_v<U, V>; static_assert ( same<std::remove_cv_t<int>, int> && same<std::remove_cv_t<const int>, int> && same<std::remove_cv_t<volatile int>, int> && same<std::remove_cv_t<const volatile int>, int> && // remove_cv only works on types, not on pointers not same<std::remove_cv_t<const volatile int*>, int*> && same<std::remove_cv_t<const volatile int*>, const volatile int*> && same<std::remove_cv_t<const int* volatile>, const int*> && same<std::remove_cv_t<int* const volatile>, int*> ); int main() {}
[bearbeiten] Siehe auch
| (C++11) |
prüft, ob ein Typ const-qualifiziert ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ volatile-qualifiziert ist (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
fügt const und/oder volatile Spezifizierer zum gegebenen Typ hinzu (Klassenvorlage) |
| (C++20) |
kombiniert std::remove_cv und std::remove_reference (Klassenvorlage) |