Je veux écrire un type de trait pour vérifier si un type a un membre de l' member
. Si member
ont été publique, il ya un certain nombre de façons de le faire (par exemple, void_t
), la plus concise de ce qui est probablement Yakk de l' can_apply
(qui pourrait éventuellement être appelé 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
Mais si le membre était privé, ce trait de caractère ne parvient pas, depuis l'accès sur l' member
est mal formé (nous ne sommes pas des amis) et il n'y a pas de différenciation entre les mauvais formé en raison de l'accès raisons et mal formé pour cette raison-chose-ne pas exister raisons:
class D {
int member;
};
static_assert(has_member<D>{}, "!"); // error
Est-il possible d'écrire un tel membre vérificateur à travers tous les contrôles d'accès?