Espacios de nombres
Variantes

std::is_pointer_interconvertible_with_class

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 S, class M> constexpr bool is_pointer_interconvertible_with_class( M S::* mp ) noexcept;
(desde C++20)

Dado un objeto s de tipo S, determina si s.*mp se refiere a un subobjeto de s y s es interconvertible por puntero con su subobjeto s.*mp. El programa está mal formado si S no es un tipo completo.

Si S no es un tipo de diseño estándar (StandardLayoutType), o M no es un tipo objeto, o mp es igual a nullptr, el resultado es siempre false.

Parámetros

mp - Un puntero a miembro a detectar.

Return value

true si s.*mp se refiere a un subobjeto de s y s interconvertible por puntero con su subobjeto s.*mp; de lo contrario false, donde s es un objeto de tipo S.

Notas

El tipo de una expresión de puntero a miembro &S::m no siempre es M S::*, donde m es de tipo M, porque m puede ser un miembro heredado de una clase base de S. El primer argumento de plantilla puede especificarse para poder evitar resultados potencialmente sorprendentes.

Si existe un valor mp de tipo M S::* tal que std::is_pointer_interconvertible_with_class(mp) == true, entonces reinterpret_cast<M&>(s) tiene un resultado bien definido y se refiere al mismo subobjeto que s.*mp, donde s es un lvalue válido de tipo S.

En plataformas comunes, el patrón de bits de mp es todo ceros si std::is_pointer_interconvertible_with_class(mp) == true.

Example

#include <type_traits>
#include <iostream>

struct Foo { int x; };
struct Bar { int y; };

struct Baz : Foo, Bar {}; // no es de diseño estándar

int main()
{
    std::cout << std::boolalpha
        << std::is_same_v<decltype(&Baz::x), int Baz::*>
        << std::is_pointer_interconvertible_with_class(&Baz::x) << '\n'
        << std::is_pointer_interconvertible_with_class<Baz>(&Baz::x) << '\n';
}

Salida:

false
true
false

Véase también

Comprueba si un tipo es un tipo de diseño estándar.
(plantilla de clase) [editar]
Comprueba si un tipo es un puntero a un objeto miembro no estático
(plantilla de clase) [editar]