Espacios de nombres
Variantes

std::is_pointer_interconvertible_base_of

De cppreference.com
 
 
Biblioteca de servicios
 
Apoyo de tipos
Tipos básicos
Tipos fundamentales
Tipos enteros de anchura fija (C++11)
Límites numéricos
Interfaz de C de límites numéricos
Información de tipo
en tiempo de ejecución
Rasgos de tipos
Categorías de tipos
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
Operaciones soportadas
Relaciones y consultas de propiedades
Modificaciones de tipos
(C++11)(C++11)(C++11)
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
(C++11)(hasta C++20)(C++17)
 
<tbody> </tbody>
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

  • U sea un tipo objeto completo,
  • T sea un tipo objeto completo con calificación-cv no menor que U,
  • u sea cualquier lvalue válido de U,

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

Comprueba si un tipo es derivado de otro tipo
(plantilla de clase) [editar]
(C++11)
Comprueba si un tipo es un tipo de clase que no es una unión y no tiene datos.
(plantilla de clase) [editar]
Comprueba si un tipo es un tipo de diseño estándar.
(plantilla de clase) [editar]