error C3861: 'privateMemerAccessEnablerAux': identifier not found
note: 'privateMemerAccessEnablerAux': function was not declared in the template definition context and can be found only via argument-dependent lookup in the instantiation context
note: see reference to alias template instantiation 'PrivateMemberAccess<A_value>' being compiled
_NN>error C3861: 'privateMemerAccessEnablerAux': identifier not found
_NN>note: 'privateMemerAccessEnablerAux': function was not declared in the template definition context and can be found only via argument-dependent lookup in the instantiation context
_NN>note: see reference to alias template instantiation 'PrivateMemberAccess<A_value>' being compiled
Ну, ожидаемо, в принципе. Они часто запаздывают, но рано или поздно чинят.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, ViTech, Вы писали:
_NN>В том и дело, что в специализации можно использовать decltype, но за пределами уже нельзя. _NN>Например тут как добраться до MemberPtr ?
Я показал способы, как добраться до decltype(&A::m_value) внутри специализации. Действительно, толку от этого мало, потому как тип нужен снаружи. Надо думать, как отвязаться от зависимости decltype(&A::m_value) в параметре шаблона после того, как доступ к нему получен. Может что-то в таком ключе:
Может в какую-нибудь статическую переменную указатель сохранить (как pointerToMember в начальном примере). Но для этого тоже тип нужен, если только void* не использовать .
_NN>X<decltype(&A::m_value)::MemberPtr не скомпилируется.
И правильно сделается, а то слишком просто было бы .
Во всей этой истории мне интересно, зачем в стандарте такое исключение сделали. Явно не для того, чтоб кто угодно мог по приватным данным шарить. Предполагаю, это нужно, чтобы была возможность специализировать шаблоны для типов из приватных секций(чтоб костыли не писать и в публичных секциях эти типы показывать). Соответственно, пользоваться этими специализациями могут только те, у кого есть доступ к приватным типам, а не все подряд. Есть ещё мысли на этот счёт?
Пока сам не сделаешь...
Re[5]: [Trick] Легальный способ доступа к закрытым членам
Собрав всё воедино получилось вытащить тип и указатель на член наружу.
Получилось вытащить смещение от начала класса, что в принципе должно быть достаточно, чтобы получить доступ.
Осталось понять получить всё во времени компиляции.
Здравствуйте, _NN_, Вы писали:
_NN>Собрав всё воедино получилось вытащить тип и указатель на член наружу.
_NN>Получилось вытащить смещение от начала класса, что в принципе должно быть достаточно, чтобы получить доступ. _NN>Осталось понять получить всё во времени компиляции.
Ну так пока что только смещение и удалось вытащить, ну а что дальше? Чтобы получить-таки доступ к члену, придется использовать принудительное преобразование к нужному типу, который указывать, опять же, придется вручную. Ведь decltype(&A::value) здесь снова не прокатит. Или я чего-то не понял?
--
Re[7]: [Trick] Легальный способ доступа к закрытым членам
Здравствуйте, rg45, Вы писали:
R>Ну так пока что только смещение и удалось вытащить, ну а что дальше? Чтобы получить-таки доступ к члену, придется использовать принудительное преобразование к нужному типу, который указывать, опять же, придется вручную. Ведь decltype(&A::value) здесь снова не прокатит. Или я чего-то не понял?