std::is_corresponding_member
Von cppreference.com
| Definiert in der Kopfdatei <type_traits> |
||
| template< class S1, class S2, class M1, class M2 > constexpr bool is_corresponding_member( M1 S1::* mp, M2 S2::* mq ) noexcept; |
(seit C++20) | |
Bestimmt, ob mp und mq auf entsprechende Member in der gemeinsamen Anfangssequenz von S1 und S2 verweisen. Das Programm ist schlecht geformt, wenn S1 oder S2 ein unvollständiger Typ ist.
Wenn S1 oder S2 kein StandardLayoutType ist, oder wenn M1 oder M2 kein Objekttyp ist, oder wenn mp oder mq gleich nullptr ist, ist das Ergebnis immer false.
Inhalt |
[edit] Parameter
| mp, mq | - | Zeiger auf Member, die erkannt werden sollen |
[edit] Rückgabewert
true, wenn mp und mq auf entsprechende Member in der gemeinsamen Anfangssequenz von S1 und S2 verweisen, andernfalls false.
[edit] Hinweise
Der Typ eines Zeiger-auf-Member-Ausdrucks &S::m ist nicht immer M S::*, wobei m vom Typ M ist, da m ein von einer Basisklasse von S geerbter Member sein kann. Die Template-Argumente können angegeben werden, um potenziell überraschende Ergebnisse zu vermeiden.
[edit] Beispiel
Führen Sie diesen Code aus
#include <type_traits> struct Foo { int x; double d; }; struct Bar { int y; double z; }; struct Baz : Foo, Bar {}; // not standard-layout static_assert( std::is_same_v<decltype(&Baz::x), int Foo::*> == true && std::is_same_v<decltype(&Baz::y), int Bar::*> == true && std::is_corresponding_member(&Foo::x, &Bar::y) == true && std::is_corresponding_member(&Foo::d, &Bar::z) == true && std::is_corresponding_member(&Baz::x, &Baz::y) == true && std::is_corresponding_member<Baz, Baz, int, int>(&Baz::x, &Baz::y) == false ); int main() {}
[edit] Siehe auch
| (C++11) |
prüft, ob ein Typ ein Standardlayout-Typ ist (Klassenvorlage) |
| (C++20) |
prüft, ob zwei Typen Layout-kompatibel sind (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Zeiger auf ein nicht-statisches Member-Objekt ist (Klassenvorlage) |