能否编写C++程判断以下成员的访问权限是private、protected、public的?
例如，给出定义:class A{ int x; procedted: int y;};能否编程判断A::x和A::y的访问权限分别是private和protected的吗? 若能则编程打印它们的访问权限。
把 member detector idiom 改一改就行了。检测访问控制是否为 public 很简单，利用 SFINAE，想办法把一个 memberaccess expression 整到函数签名上就完事：template  class IsPublicMember { template  staticstd::true_type Test(decltype(std::declval _().x)*); template staticstd::false_type Test(...); public: constexpr static bool value =decltype(Test(0))::value; }; 检测访问控制是否为 protected，只需要在此基础上，把 SFINAE 相关函数弄到一个 T的派生类里面（因此其实是检测 T::x 的访问控制是否为 protected 或者 public）：template  classIsProtectedMember { struct Derived : T { template  static std::true_typeTest(decltype(std::declval _().x)*); template static std::false_typeTest(...); }; public: constexpr static bool value =decltype(Derived::Test(0))::value; }; 检测访问控制是否为 private 则需要一点技巧；需要利用的特性是当 namelookup 在派生类的 scope 中开始查找某个名称 name 时，如果多个不相关基类均包含 name 的声明，则产生 ambiguity错误，无论基类中 name 的访问控制如何：class Base1 { int data; }; struct Base2 { int data; };struct Derived : Base1, Base2 { int getData() { return data; // Ambiguity! }}; 利用这个特性可以实现检测 private 成员：template  class IsPrivateMember { struct Fallback {int x; }; struct Derived : T, Fallback { template  static std::false_typeTest(decltype(std::declval _().x)*); template static std::true_type Test(...);}; public: constexpr static bool value = decltype(Derived::Test(0))::value; };注意新引入的 Fallback 基类。在 Derived 中，如果访问 x 导致 ambiguity（或者 substitution failure），说明T 中包含同名的成员（因此其实是检测 T::x 的访问控制是否为 private，protected 或 public，即有没有这个成员），因此没有SFINAE 的 Test 函数返回 std::true_type 。综合一下即可实现检测 T::x 的访问控制：template  constexprconst char* DetectMember() { if constexpr (IsPublicMember::value) { return"public"; } else if constexpr (IsProtectedMember::value) { return "protected";} else if constexpr (IsPrivateMember::value) { return "private"; } else {return "member does not exist"; } } 测试：https://godbolt.org/z/nrP4n87qn