// 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, typename tag >
class access_bypass {
    friend type get( tag )
        { return value; }
};

// Client code.

struct pcsi {};
struct pci {};
struct pcfi {};

int * get( pcsi );
int c::* get( pci );
void (c::* get( 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.* get( pci() ) = 3;
    b.* get( pci() ) = 5;
    * get( pcsi() ) = 8;
    
    std::cout << a.* get( pci() ) << ' ' << b.* get( pci() ) << ' ' << * get( pcsi() ) << '\n';
    
    (a.* get( pcfi() ) )( 7 );
    
    std::cout << a.* get( pci() ) << ' ' << b.* get( pci() ) << ' ' << * get( pcsi() ) << '\n';
}