Boost logo

Boost Users :

Subject: Re: [Boost-users] [Unordered] [Multi-Index] Set lookup from something else than key_type
From: Daniel James (daniel_james_at_[hidden])
Date: 2009-09-02 06:47:56


2009/9/2 <joaquin_at_[hidden]>:
>
> You don't need SFINAE in order to implement compatible keys, it's much
> simpler
> than that, let me sketch how it goes. Say for instance we want to extend
> your find member
> function to support compatible keys. Currently this member function looks
> like:
>
>  const_iterator find(const key_type& k) const
>  {
>   // uses hash_function()(k), key_eq()(k,x), key_eq()(x,k)
>  }
>
> Now you only have to templatize find (and the internal member functions this
> relies on) on the key type, while leaving the code itself untouched:
>
>  template<typename CompatibleKey>
>  const_iterator find(const CompatibleKey& k) const
>  {
>   // uses hash_function()(k), key_eq()(k,x), key_eq()(x,k)
>  }
>
> When the user calls find with a regular key_type value, everything works as
> it used to. When the value passed is of some other type, the code will
> automatically use the correct overloads of hash_function and key_eq,
> provided

But those overloads don't always exist. A simple example is:

    struct hash {
        std::size_t operator()(std::string const&) const;
    };

    struct equals {
        bool operator()(std::string const&, std::string const&) const;
    };

    boost::unordered_map<std::string, int, hash, equals> map;
    // ....
    map.find("char array");

A single string object should be created in this case.

Daniel


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net