Я хочу написать черту типа, чтобы проверить, имеет ли какой-то тип член member
. Если member
были общедоступными, существует множество способов сделать это (например, void_t
), наиболее кратким из которых является, вероятно, Yakk can_apply
(который в итоге можно было бы назвать std::is_detected
):
struct C {
int member;
};
template <typename T>
using member_type = decltype(&T::member);
template <typename T>
using has_member = can_apply<member_type, T>;
static_assert(has_member<C>{}, "!"); // OK
Но если член был закрыт, этот признак терпит неудачу, поскольку доступ на member
плохо сформирован (мы не друзья), и нет никакой дифференциации между плохо сформированными из-за причин доступа и плохо сформированными из-за причины этого не существуют:
class D {
int member;
};
static_assert(has_member<D>{}, "!"); // error
Есть ли способ написать такую проверку элемента во всех элементах управления доступом?