Интересный трюк:
template < typename T > class access_key { private: friend T; access_key() {} }; class repairmen; class elevator { public: void fix( access_key<repairman> ); }; class repairman { public: void fix_elevator( elevator & e ) { e.fix( access_key<repairman>() ); } }увидел тут