Skip to content

Instantly share code, notes, and snippets.

@falemagn
Last active February 1, 2021 20:02
Show Gist options
  • Save falemagn/59ce697c0248f7d5e4b149318e6d1b19 to your computer and use it in GitHub Desktop.
Save falemagn/59ce697c0248f7d5e4b149318e6d1b19 to your computer and use it in GitHub Desktop.
[c++] Get hold of any class' private members. Lawfully.
/* Inspired to the work of hliberacki: https://github.com/hliberacki/cpp-member-accessor
* But made it much shorter, and works even with C++98.
*
* Usage:
*
* class PrivateStuff
* {
* int dont_steal;
* };
*
* struct privy: access_member<privy, int PrivateStuff::*>{};
* template class privy::set<&PrivateStuff::dont_steal>;
*
* int robber(PrivateStuff *p)
* {
* return p->*privy::get;
* }
*/
#ifndef ACCESS_MEMBER_HPP
#define ACCESS_MEMBER_HPP
template <typename Tag, typename MemberType>
struct access_member {
template <MemberType Member>
class set {
struct worker {
worker() { get = Member; }
};
static worker worker_;
};
static MemberType get;
};
template <typename Tag, typename MemberType>
MemberType access_member<Tag, MemberType>::get;
template <typename Tag, typename MemberType>
template <MemberType Member>
typename access_member<Tag, MemberType>::template set<Member>::worker access_member<Tag, MemberType>::template set<Member>::worker_;
#endif
@falemagn
Copy link
Author

falemagn commented Jan 31, 2021

Working example on godbolt: https://godbolt.org/z/8asGns

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment