std::is_corresponding_member
Определён в заголовочном файле <type_traits> | ||
|---|---|---|
template< class S1, class S2, class M1, class M2 > constexpr bool is_corresponding_member( M1 S1::* mp, M2 S2::* mq ) noexcept; | (начиная с C++20) |
Определяет, ссылаются ли mp и mq на соответствующие члены в общей начальной последовательности S1 и S2. Программа некорректна, если S1 или S2 имеет неполный тип.
Если S1 или S2 не является типом StandardLayoutType, или M1 или M2 не является объектным типом, или mp или mq равен nullptr, результатом всегда будет false.
Параметры
| mp, mq | - | указатели на члены для проверки |
Возвращаемое значение
true, если mp и mq ссылаются на соответствующие члены в общей начальной последовательности S1 и S2, иначе false.
Примечания
Тип выражения с указателем на член &S::m не всегда является M S::*, где m имеет тип M, поскольку m может быть членом, унаследованным от базового класса S. Аргументы шаблона можно указать, чтобы избежать потенциально неожиданных результатов.
Пример
#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() {}
См. также
|
(C++11) | проверяет, является ли тип типом со стандартным расположением (шаблон класса) |
|
(C++20) | проверяет, являются ли два типа совместимыми по расположению (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатический объект-член (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_corresponding_member