std::is_corresponding_member
Материал из cppreference.com
Определено в заголовочном файле <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) |
проверяет, является ли тип указателем на нестатический объект-элемент (шаблон класса) |