Created
April 24, 2024 01:50
-
-
Save BlenderSleuth/d180c4c6e9110b0e050c0baeadf000c0 to your computer and use it in GitHub Desktop.
C++ Private Variable Robber
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
// Tricky template trick to access private members. | |
// https://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html | |
template <typename Tag, typename Tag::Type M> | |
struct TRob | |
{ | |
friend typename Tag::Type Get(Tag) | |
{ | |
return M; | |
} | |
}; | |
template <typename Tag, typename Member> | |
struct TTagBase | |
{ | |
typedef Member Type; | |
friend Type Get(Tag); | |
}; | |
#define DEFINE_ROBBER(ClassName, MemberType, MemberName) \ | |
struct F##MemberName##Tag : TTagBase<F##MemberName##Tag, MemberType ClassName::*> {}; \ | |
template struct TRob<F##MemberName##Tag, &ClassName::MemberName>; \ | |
MemberType& Access##MemberName(ClassName* Object) { return Object->*Get(F##MemberName##Tag()); } | |
// How to use: | |
// DEFINE_ROBBER(AActor, float, LastRenderTime); | |
// float& LastRenderTime = AccessLastRenderTime(ActorPtr); | |
// | |
// With great power comes great responsibility. | |
// |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment