I'm trying to use Boost-MultiIndex to achieve:

1) the equivalent (or similar) functionality & performance of an std::map<std::string, ValType> with searches by std::string
2) perform searches by const char* without creating a temporary std::string and without copying the actual char's

--------------------------code-----------------------
#include <string>
#include <functional>
#include <cassert>

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>

using namespace boost;
using namespace boost::multi_index;

struct elem
{
    std::string m_key;
    double m_value;
    elem( const std::string& key, double value) : m_key(key), m_value(value) {}
};

struct less_string : std::less<std::string>
{
    using std::less<std::string>::operator();
    // use operator<
    bool operator() (const std::string& lhs, const char* rhs) const {return lhs < rhs;}
    bool operator() (const char* lhs, const std::string& rhs) const {return lhs < rhs;}
};

typedef multi_index_container<   
    elem,
    indexed_by<
        ordered_unique< member<elem,std::string,&elem::m_key>, less_string >
    >
> elem_set;

int main()
{
    elem_set s;
    s.insert( elem("p", 1.0) );
    assert( s.find("p") != s.end() ); // no temporary and no data copy! I did it!
    return 0;
}
--------------------------code-----------------------

Is this the right way to go? Any hint will be appreciated.
TIA

PS: I know I'm actually getting something more like a std::set, it's ok