std:: add_cv, std:: add_const, std:: add_volatile
From cppreference.net
C++
Metaprogramming library
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<type_traits>
|
||
|
template
<
class
T
>
struct add_cv ; |
(1) | (desde C++11) |
|
template
<
class
T
>
struct add_const ; |
(2) | (desde C++11) |
|
template
<
class
T
>
struct add_volatile ; |
(3) | (desde C++11) |
Proporciona el typedef miembro
type
que es el mismo que
T
, excepto que tiene un calificador cv añadido (a menos que
T
sea una función, una referencia, o ya tenga este calificador cv)
1)
añade tanto
const
como
volatile
2)
añade
const
3)
añade
volatile
Si el programa añade especializaciones para cualquiera de las plantillas descritas en esta página, el comportamiento no está definido.
Contenidos |
Tipos de miembros
| Nombre | Definición |
type
|
el tipo
T
con el calificador cv
|
Tipos auxiliares
|
template
<
class
T
>
using add_cv_t = typename add_cv < T > :: type ; |
(desde C++14) | |
|
template
<
class
T
>
using add_const_t = typename add_const < T > :: type ; |
(desde C++14) | |
|
template
<
class
T
>
using add_volatile_t = typename add_volatile < T > :: type ; |
(desde C++14) | |
Implementación posible
template<class T> struct add_cv { typedef const volatile T type; }; template<class T> struct add_const { typedef const T type; }; template<class T> struct add_volatile { typedef volatile T type; }; |
Notas
Estos rasgos de transformación pueden utilizarse para establecer contextos no deducidos en la deducción de argumentos de plantilla:
template<class T> void f(const T&, const T&); template<class T> void g(const T&, std::add_const_t<T>&); f(4.2, 0); // error, tipos deducidos en conflicto para 'T' g(4.2, 0); // OK, llama a g<double>
Ejemplo
Ejecutar este código
#include <iostream> #include <type_traits> struct foo { void m() { std::cout << "Non-cv\n"; } void m() const { std::cout << "Const\n"; } void m() volatile { std::cout << "Volatile\n"; } void m() const volatile { std::cout << "Const-volatile\n"; } }; int main() { foo{}.m(); std::add_const<foo>::type{}.m(); std::add_volatile<foo>::type{}.m(); std::add_cv<foo>::type{}.m(); }
Salida:
Non-cv Const Volatile Const-volatile
Véase también
|
(C++11)
|
comprueba si un tipo está calificado como const
(class template) |
|
(C++11)
|
comprueba si un tipo está calificado como volatile
(class template) |
|
(C++11)
(C++11)
(C++11)
|
elimina los especificadores
const
y/o
volatile
del tipo dado
(class template) |
|
(C++17)
|
obtiene una referencia
const
a su argumento
(function template) |