std:: is_corresponding_member
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<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 {}; // не 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)
|
проверяет, является ли тип указателем на нестатический член-объект
(шаблон класса) |