访问类的私有成员和方法

89d6a45ad2f880f68bd64e61ccdaf057.png

#include <iostream>

class Foo
{
private:
    int _A = 1;
    void _bar() { std::cout << " Access private func \n"; }
};

template<typename M>
class PrivateAccessor
{
public:
    inline static typename M::Type MP;
};

template<typename M, typename M::Type MP>
struct InitFooMemberPtr
{
    struct Accessor
    {
        Accessor()
        {
            PrivateAccessor<M>::MP = MP;
        }
    };
    inline static Accessor accessor;
};

struct FooMemberTrait
{
    using Type = int Foo::*;
};
template struct InitFooMemberPtr<FooMemberTrait, &Foo::_A>;

template<typename M, typename M::Type MP>
struct InitFooFuncPtr
{
    struct Accessor
    {
        Accessor()
        {
            PrivateAccessor<M>::MP = MP;
        }
    };
    inline static Accessor accessor;
};

struct FooFuncTrait
{
    using Type = void (Foo::*)();
};
template struct InitFooFuncPtr<FooFuncTrait, &Foo::_bar>;

int main()
{
    Foo foo;
    PrivateAccessor<FooMemberTrait> foo_a;
    PrivateAccessor<FooFuncTrait> foo_bar;
    std::cout << "private member _A is " << foo.*foo_a.MP << std::endl;
    (foo.*foo_bar.MP)();
    return 0;
}