Пространства имён
Варианты
Действия

std::is_corresponding_member

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <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() {}

[править] Смотрите также

проверяет, является ли тип типом со стандартной компоновкой
(шаблон класса) [править]
проверяет, являются ли два типа совместимыми по компоновке
(шаблон класса) [править]
проверяет, является ли тип указателем на нестатический объект-элемент
(шаблон класса) [править]