#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 { 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; } // namespace exposer #define FORCIBLY_ACCESS(Class, Member, Type) \ namespace exposer { \ template struct ExposerImpl; \ inline auto& Class##_##Member(Class &T) { \ return T.*exposer::Exposer::ptr; \ } \ }