最終更新日時(UTC):
が更新

履歴 編集

function template
<type_traits>

std::is_corresponding_member(C++20)

namespace std {
  template<class S1, class S2, class M1, class M2>
  constexpr bool is_corresponding_member(M1 S1::*m1, M2 S2::*m2) noexcept;
}

概要

2つのメンバポインタが互換な共通位置にあるかを判定する。

適格要件

S1およびS2完全型であること。

戻り値

S1およびS2スタンダードレイアウト型M1およびM2はオブジェクト型であり、m1m2いずれもヌルポインタではなく、m1m2同一の先頭のメンバの並び(common initial sequence)において対応するメンバ変数へのポインタであるときに限ってtrueを返す。それ以外の場合はfalseを返す。

例外

投げない

#include <type_traits>

struct A { int a; };
struct B { int b; };
struct C: A, B {};

int main()
{
  static_assert( std::is_corresponding_member( &A::a, &B::b ));
  static_assert( std::is_corresponding_member<A, B>( &A::a, &B::b ));

  // 見た目に反して &C::a, &C::b はそれぞれ int(A::*), int(B::*) 型を持つため、
  // このケースではS1=A, S2=Bに型推論されて前述例と同様にtrueを返す。
  static_assert( std::is_corresponding_member( &C::a, &C::b ));
  // テンプレートパラメータを明示することでクラスCのメンバ変数に対する検査となる。
  // このケースではCはスタンダードレイアウトクラスではなくfalseを返す。
  static_assert(!std::is_corresponding_member<C, C>( &C::a, &C::b ));
}

出力

バージョン

言語

  • C++20

処理系

関連項目

参照