Namespaces
Variants

std:: is_corresponding_member

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definiert im Header <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 fehlerhaft, wenn entweder S1 oder S2 ein unvollständiger Typ ist.

Wenn entweder S1 oder S2 kein StandardLayoutType ist, oder entweder M1 oder M2 kein Objekttyp ist, oder entweder mp oder mq gleich nullptr ist, dann ist das Ergebnis stets false .

Inhaltsverzeichnis

Parameter

mp, mq - Zeiger-auf-Mitglied zum Erkennen

Rückgabewert

true wenn mp und mq auf entsprechende Member in der gemeinsamen Anfangssequenz von S1 und S2 verweisen, andernfalls false .

Hinweise

Der Typ eines Zeiger-auf-Mitglied-Ausdrucks & S :: m ist nicht immer M S :: * , wobei m vom Typ M ist, da m ein von einer Basisklasse von S geerbtes Mitglied sein kann. Die Template-Argumente können angegeben werden, um potenziell überraschende Ergebnisse zu vermeiden.

Beispiel

#include <type_traits>
struct Foo
{
    int x;
    double d;
};
struct Bar
{
    int y;
    double z;
};
struct Baz : Foo, Bar {}; // nicht 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() {}

Siehe auch

prüft, ob ein Typ ein Standard-Layout Typ ist
(Klassentemplate)
prüft, ob zwei Typen layout-kompatibel sind
(Klassentemplate)
prüft, ob ein Typ ein nicht-statischer Member-Objekt-Zeiger ist
(Klassentemplate)