std::is_pointer_interconvertible_base_of
| Definido en el archivo de encabezado <type_traits>
|
||
template< class Base, class Derived > struct is_pointer_interconvertible_base_of; |
(desde C++20) | |
Si Derived se deriva inequivocadamente de Base y todo objeto Derived es interconvertible por puntero con su subobjeto Base, o si ambas son la misma clase que no es una unión (en ambos casos ignorando la calificación-cv), proporciona la constante miembro value igual a true; de lo contrario, value es false.
Si tanto Base como Derived son tipos clase que no son uniones, y no son el mismo tipo (ignorando la calificación-cv), Derived deberá ser un tipo completo; de lo contrario, el comportamiento está indefinido.
El comportamiento de un programa que añade especializaciones para is_pointer_interconvertible_base_of o is_pointer_interconvertible_base_of_v no está definido.
Plantilla de variable auxiliar
<tbody> </tbody> template< class Base, class Derived > inline constexpr bool is_pointer_interconvertible_base_of_v = is_pointer_interconvertible_base_of<Base, Derived>::value; |
(desde C++20) | |
Heredado de std::integral_constant
Constantes miembro
value [estático] |
true si Derived se deriva inequivocadamente de Base y todo objeto Derived es interconvertible por puntero con su subobjeto Base, o si ambas son la misma clase que no es una unión (en ambos casos ignorando la calificación-cv), 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>
|
Notas
std::is_pointer_interconvertible_base_of_v<T, U> puede ser true incluso si T es una clase base privada o protegida de U.
Dejemos que
Usea un tipo objeto completo,Tsea un tipo objeto completo con calificación-cv no menor queU,usea cualquier lvalue válido deU,
reinterpret_cast<T&>(u) siempre tiene un resultado bien definido si std::is_pointer_interconvertible_base_of_v<T, U> es true.
Si T y U no son el mismo tipo (ignorando la calificación-cv) y T es una clase base de U interconvertible por puntero, entonces tanto std::is_standard_layout_v<T> como std::is_standard_layout_v<U> son true.
Si T es un tipo clase vacío, entonces todas las clases base de T (si las hay) son una clase base de T interconvertibles por puntero.
Si T es un tipo clase no vacío con diseño estándar, entonces todas las clases base no vacías de T (si las hay) son una clase base de T interconvertibles por puntero, en este caso, algunas clases base vacías (si las hay) también podrían ser clases base interconvertibles por puntero.
Ejemplo
#include <iostream>
#include <type_traits>
struct Foo {};
struct Bar {};
class Baz : Foo, public Bar {
int x;
};
class NonStdLayout : public Baz {
int y;
};
int main()
{
std::cout << std::boolalpha
<< std::is_pointer_interconvertible_base_of_v<Bar, Baz> << '\n'
<< std::is_pointer_interconvertible_base_of_v<Foo, Baz> << '\n';
<< std::is_pointer_interconvertible_base_of_v<Baz, NonStdLayout> << '\n'
<< std::is_pointer_interconvertible_base_of_v<NonStdLayout, NonStdLayout> << '\n';
}
Salida:
true
true
false
true
Véase también
(C++11) |
Comprueba si un tipo es derivado de otro tipo (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo de clase que no es una unión y no tiene datos. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo de diseño estándar. (plantilla de clase) |