Я пытаюсь написать код, который делает это. Что-то вроде следующего
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>{});
Но я не могу заставить это работать. Обратите внимание, что я не спрашиваю, как выяснить , сколько существует publi c членов данных, их типов или имен.
I can заставляйте подобные вещи работать в некоторых случаях.
- Если я знаю имена участников, доступ к которым мне небезразличен.
- Если я хочу проверить, что нет членов данных вообще (private / publi c). (игнорируя виртуальное наследование)
Но я не могу различить guish между классами, которые отличаются только спецификаторами доступа членов. Я предполагал, что, вероятно, существует какой-то способ сделать это, пока я не нашел this на cppreference,
Проверка доступа к члену является последним шагом после любого данного Языковая конструкция интерпретируется. Цель этого правила состоит в том, что замена любого частного на publi c никогда не изменяет поведение программы.
(я не смог найти эту точную формулировку здесь , но я предполагаю, что cppreference правильно интерпретирует текст.)
Это наводит меня на мысль, что Решение моей проблемы нарушило бы это намерение. Так значит ли это, что это вообще невозможно? Или еще есть надежда, а я что-то упустил?