std::is_pointer_interconvertible_with_class
| 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
(C++11) |
Comprueba si un tipo es un tipo de diseño estándar. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un puntero a un objeto miembro no estático (plantilla de clase) |