Chcę napisać cechę typu, aby sprawdzić, czy jakiś typ ma członka member
. Jeśli member
były publicznego, istnieją różne sposoby, aby to zrobić (np void_t
), z których najbardziej zwięzły jest prawdopodobnie Yakk's can_apply
(które mogłyby ostatecznie nazwać std::is_detected
):Wykryto istnienie członka prywatnego
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
Ale jeśli członek byli prywatna, ta cecha zawodzi, ponieważ dostęp pod member
jest źle sformułowany (nie jesteśmy przyjaciółmi) i nie ma rozróżnienia między źle uformowanymi z powodów dostępu i źle uformowanymi z powodu tego-rzeczy-nie- istnieją powody:
class D {
int member;
};
static_assert(has_member<D>{}, "!"); // error
Czy istnieje sposób na zapisanie takiego kontrolera dla wszystkich kontroli dostępu?
Nie próbuje tego powiedzieć, to zły pomysł. Nie mam kwalifikacji, aby to zrobić. Ale jestem naprawdę ciekawa, jaki byłby pożytek z tego? Np. Jaki jest przypadek użycia zapytań o "prywatne" cechy typu (do których nie miałeś dostępu w żaden sposób)? – DevSolar
Zobacz http://stackoverflow.com/questions/257288/possible-for-c-template-to-check-for-a-functions-existence#264088 – mvw
Jeśli 'member' jest prywatne, powinieneś móc bezpiecznie zmienić nazwę ten członek bez łamania kodu zewnętrznego, który po prostu używa twojej klasy. Możliwość tworzenia szablonu 'has_member' w taki sposób, w jaki go używasz, sprawi, że * bardzo * łatwo będzie stworzyć kod, który przynajmniej nie działa w taki sposób, w jaki inny programista mógłby rozsądnie oczekiwać działania kodu. Podzielam więc pytanie DevSolar: jaki masz na to pożytek? – hvd