访问类的私有成员和方法

#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;
}