// Target class.

class c {
    static int si;
    int i;
    void fi( int arg ) { si = i = arg; }
};

int c::si;

// Library code.

template< typename type, type value, type & receiver >
class access_bypass {
    static struct mover {
        mover()
            { receiver = value; }
    } m;
};

template< typename type, type value, type & receiver >
typename access_bypass< type, value, receiver >::mover
    access_bypass< type, value, receiver >::m;

// Client code.

int *pcsi;
int c::*pci;
void (c::*pcfi)( int );

template class access_bypass< int *, & c::si, pcsi >;
template class access_bypass< int c::*, & c::i, pci >;
template class access_bypass< void (c::*)( int ), & c::fi, pcfi >;

#include <iostream>

int main() {
    c a, b;
    
    a.* pci = 3;
    b.* pci = 5;
    * pcsi = 8;
    
    std::cout << a.* pci << ' ' << b.* pci << ' ' << * pcsi << '\n';
    
    (a.* pcfi)( 7 );
    
    std::cout << a.* pci << ' ' << b.* pci << ' ' << * pcsi << '\n';
}