C++ 我可以检测类是否有任何公共的非静态数据成员吗?

C++ 我可以检测类是否有任何公共的非静态数据成员吗?,c++,template-meta-programming,access-specifier,C++,Template Meta Programming,Access Specifier,我正在尝试编写实现这一点的代码。类似于下面的内容 struct A { int i; }; struct B { private : int i; }; static_assert(has_public_non_static_data_members<A>{}); static_assert(! has_public_non_static_data_members<B>{}); 结构A{int i;}; 结构B{private:inti;}; 静态断言(在CPPFREF

我正在尝试编写实现这一点的代码。类似于下面的内容

struct A { int i; };
struct B { private : int i; };
static_assert(has_public_non_static_data_members<A>{});
static_assert(! has_public_non_static_data_members<B>{});
结构A{int i;}; 结构B{private:inti;}; 静态断言(在CPPFREFENCE上有非静态数据成员

成员访问检查是解释任何给定语言构造后的最后一步。此规则的目的是用公共替换任何私有不会改变程序的行为

(我找不到确切的措辞,但我认为cppreference正确地解释了文本。)

这对我来说意味着我的问题的解决方案违背了这个意图。
那么,这是否意味着根本不可能?还是还有希望,而我只是错过了一些东西?

你可能会处理一些其他特殊情况,如
聚合
,但我不认为你可以在没有未来反思的情况下创造你的特征。“用公共代替私人”不会更改所选的重载,但是,使用SFINAE进行Dispatching可能会允许选择不同的函数。@Jarod42这似乎适用于成员函数,但适用于数据成员吗?你的意思是,类似“是”的东西,完全正确。除此之外,如果我没有像I这样的名称,我可以这样做吗?同样,这不是一个代码示例吗“通过更改访问说明符来更改程序的行为”?您可能会处理一些其他特殊情况,如
聚合
,但我认为您不可能在没有将来反思的情况下创建您的特性。”将任何私有特性替换为公共特性“不会更改所选的重载,但是,使用SFINAE进行Dispatching可能会允许选择不同的函数。@Jarod42这似乎适用于成员函数,但适用于数据成员吗?你的意思是,确切地说,类似于是。除了,如果我没有名字,比如I,我可以这样做吗?同样,这不是一个代码示例吗?”“通过更改访问说明符来更改程序的行为”?