I need to write a map class which distinguishes read from writing using the subscripting notation, so I wrapped the std::map, forwarded all the typdefs and methods, except for operator[], like this template < class Key, class T, template < typename Core > class Access
struct my_map { typedef std :: map< Key, T > core_type; typedef Access< core_type > proxy_type;
typedef typename core_type :: key_type key_type; // ...lots of other stuff... proxy_type operator[]( const key_type & key ); }; where a typical 'Access' policy might be something like this. template < class T > struct proxy { typedef T map_type; typedef typename map_type :: key_type key_type; typedef typename map_type :: mapped_type mapped_type; proxy( map_type & core, const key_type & key ); proxy operator = ( const mapped_type & value ); operator mapped_type & ( ) const; }; Ok, all that broadly works, except expressions like my_map< string, string, proxy > m; if ( m[ "fred" ] == "bloggs" ).... won't compile even with a bool operator==(proxy, proxy), because the compiler can't figure out the implicit type conversions. What's needed is friend bool operator == ( proxy, const mapped_type & ); inside the proxy class, which does work. However I'd also like operator!=() to work in the same way, so I thought boost::operators, hence the declaration of proxy becomes template < class T > struct proxy : boost :: equality_comparable< proxy< T >, typename T :: mapped_type > { ... }; Which solves the problem. Now, the next twist is that I'd like to be able to compare my_map elements against any type which I can lexically convert to the mapped type, so an operator like friend template < class U > bool operator==( proxy, const U & ); but how do I express that to boost::equality_comparable, since the U type is generated by implicit instantiation, which applies to functions but not to classes? Thanks for reading. - Rob