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