#pragma once /// The exposer can forcibly access private members of a class without changing /// any code. It uses macros to construct a function that returns a reference /// to the target member variable. namespace exposer { // REF: http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html //template //struct Exposer { // static T ptr; //}; // //template //T Exposer::ptr; // //template //struct ExposerImpl { // static struct Factory { // Factory() { Exposer::ptr = Ptr; } // } factory; //}; // //template //typename ExposerImpl::Factory ExposerImpl::factory; //template //constexpr T fetch(); //template template struct Exposer { // constexpr friend T fetch<>() { return Val; } constexpr friend T fetch(Unique) { return Val; } }; } // namespace exposer #define FORCIBLY_ACCESS(Class, Member, Type) \ namespace exposer { \ template struct ExposerImpl; \ inline auto& Class##_##Member(Class &T) { \ return T.*exposer::Exposer::ptr; \ } \ } #define FORCE_ACCESS_VAR(Class, Member, Type, Unique) \ namespace exposer { \ struct Unique {}; \ template struct Exposer; \ constexpr Type Class::* fetch(Unique); \ Type& Class##_##Member(Class &T) { \ return T.*fetch(Unique{}); \ } \ }