Skip to content

Instantly share code, notes, and snippets.

@BlenderSleuth
Created April 24, 2024 01:50
Show Gist options
  • Save BlenderSleuth/d180c4c6e9110b0e050c0baeadf000c0 to your computer and use it in GitHub Desktop.
Save BlenderSleuth/d180c4c6e9110b0e050c0baeadf000c0 to your computer and use it in GitHub Desktop.
C++ Private Variable Robber
#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