std::is_corresponding_member
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <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>
#include <iostream>
struct Foo { int x; };
struct Bar { int y; double z; };
struct Baz : Foo, Bar {}; // нестандартная компоновка
static_assert(
std::is_same_v<decltype(&Baz::x), int Foo::*> == true
and
std::is_same_v<decltype(&Baz::y), int Bar::*> == true
and
std::is_corresponding_member(&Foo::x, &Bar::y) == true
and
std::is_corresponding_member(&Baz::x, &Baz::y) == true
and
std::is_corresponding_member<Baz, Baz, int, int>(&Baz::x, &Baz::y) == false
);
int main() {}
Смотрите также
(C++11) |
проверяет, является ли тип типом со стандартной компоновкой (шаблон класса) |
(C++20) |
проверяет, являются ли два типа совместимыми по компоновке (шаблон класса) |
(C++11) |
проверяет, является ли тип указателем на нестатический объект-элемент (шаблон класса) |