Skip to content

Instantly share code, notes, and snippets.

@BlenderSleuth
Created April 24, 2024 01:50

Revisions

  1. BlenderSleuth created this gist Apr 24, 2024.
    31 changes: 31 additions & 0 deletions PrivateVariableRobber.h
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    #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.
    //