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

履歴 編集

function
<meta>

std::meta::access_context::via(C++26)

consteval access_context via(info cls) const;

概要

指定したクラスを経由したアクセスコンテキストを返す。

継承階層において、派生クラス経由で基底クラスのメンバにアクセスする場合のアクセス制御を再現するために使用する。

戻り値

clsが表すクラスを経由した新しいaccess_contextオブジェクトを返す。

via()は、protectedメンバへのアクセス可否を決める「派生クラス経由」の文脈を切り替える。protectedメンバの可視性は、スコープ(呼び出し元)が指定クラスのメンバまたは派生クラスのメンバである場合にのみ許可される。

#include <meta>
#include <print>

class Base {
public:
  int pub = 1;
protected:
  int prot = 2;
};

class Derived : public Base {
public:
  static void check_inside() {
    // スコープはDerivedのメンバ関数 = Derivedの内部からのアクセス
    // via(Derived)によりDerived経由のアクセスとして扱われ、Baseのprotにもアクセス可能
    constexpr auto ctx = std::meta::access_context::current().via(^^Derived);
    constexpr auto count = std::meta::nonstatic_data_members_of(^^Base, ctx).size();
    std::println("Derived内からvia(Derived): {}", count);  // pub と prot の2個
  }
};

int main() {
  // スコープはmain() = Derivedの外部からのアクセス
  // via(Derived)してもmain()はDerivedの一員ではないため、protはアクセス不可
  constexpr auto ctx = std::meta::access_context::current().via(^^Derived);
  constexpr auto count = std::meta::nonstatic_data_members_of(^^Base, ctx).size();
  std::println("main()からvia(Derived): {}", count);  // pubのみの1個

  Derived::check_inside();
}

出力

main()からvia(Derived): 1
Derived内からvia(Derived): 2

バージョン

言語

  • C++26

処理系

参照