Namensräume
Varianten
Aktionen

std::is_corresponding_member

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
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

#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

prüft, ob ein Typ ein Standardlayout-Typ ist
(Klassenvorlage) [bearbeiten]
prüft, ob zwei Typen Layout-kompatibel sind
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ ein Zeiger auf ein nicht-statisches Member-Objekt ist
(Klassenvorlage) [bearbeiten]
English Deutsch 日本語 中文(简体) 中文(繁體)