std::is_empty
Definido en el archivo de encabezado <type_traits> | ||
template<class T > struct is_empty; | (desde C++11) | |
std::is_empty
es un UnaryTypeTrait.
Si T
es un tipo vacío (es un tipo clase que no es una unión, con datos miembro no estáticos distintos de campos de bits de tamaño cero, sin funciones virtuales, sin clases base virtuales, y sin clases base que no están vacías), proporciona la constante miembro value
igual a true. Para cualquier otro tipo, value
es false.
Si T
es un tipo clase que no es una unión, T
deberá ser un tipo completo; de lo contrario, el comportamiento está indefinido.
El comportamiento de un programa que añade especializaciones para is_empty
o is_empty_v
(desde C++17) no está definido.
Contenido |
[editar]Parámetros de plantilla
T | - | Un tipo a comprobar. |
[editar]Plantilla de variable auxiliar
template<class T > inlineconstexprbool is_empty_v = is_empty<T>::value; | (desde C++17) | |
Heredado de std::integral_constant
Constantes miembro
value [estático] | true si T es un tipo clase vacío, de lo contrario false. (constante miembro pública estática) |
Funciones miembro
operator bool | Convierte el objeto a bool, devuelve value . (función miembro pública) |
operator() (C++14) | Devuelve value . (función miembro pública) |
Tipos miembro
Tipo | Definición |
value_type | bool |
type | std::integral_constant<bool, value> |
[editar]Notas
Heredar de clases base vacías habitualmente no incrementa el tamaño de una clase debido a la optimización de clase vacía.
std::is_empty<T> y todos los otros rasgos de tipo son clases vacías.
[editar]Ejemplo
#include <iostream>#include <type_traits> struct A {}; struct B {int m;}; struct C {staticint m;}; struct D {virtual ~D();}; union E {}; struct F {[[no_unique_address]] E e;}; int main(){std::cout<<std::boolalpha;std::cout<<"A "<< std::is_empty<A>::value<<'\n';std::cout<<"B "<< std::is_empty<B>::value<<'\n';std::cout<<"C "<< std::is_empty<C>::value<<'\n';std::cout<<"D "<< std::is_empty<D>::value<<'\n';std::cout<<"E "<< std::is_empty<E>::value<<'\n';std::cout<<"F "<< std::is_empty<F>::value<<'\n';// el resultado depende de la ABI }
Posible salida:
A true B false C true D false E false F true
[editar]Véase también
(C++11) | Comprueba si un tipo es un tipo clase (pero no un tipo unión). (plantilla de clase) |