Sir Demios
Sir Demios

Reputation: 113

using a map with a comparator as a std::map parameter

Say I define a map with a custom comparator such as

struct Obj
{
    int id;
    std::string data;
    std::vector<std::string> moreData;
};
struct Comparator
{
    using is_transparent = std::true_type;
    bool operator()(Obj const& obj1, Obj const& obj2) { return obj1.id < obj2.id; };
}
std::map<Obj,int,Comparator> compMap;

is there a good way to ensure that downstream users don't have to implement the comparator to use the map as a map?

for instance my compiler throws an error if I try to pass it to a function with a similar type.

template<class T>
inline void add(std::map<T, int>& theMap, T const & keyObj)
{
    auto IT = theMap.find(keyObj);
    if (IT != theMap.end())
        IT->second++;
    else
        theMap[keyObj] = 1;
}
add(compMap,newObj); //type error here

EDIT: I kinda over santitized this to make a generic case. and then overlooked the obvious

template<class T, class Comp, class Alloc>
inline void add(std::map<T, int, Comp, Alloc>& theMap, T const & keyObj)

still having issues with one use not being able to deduce T, but went from 80 erros to 1 so... progress thanks everyone.

Upvotes: 0

Views: 165

Answers (2)

davidhigh
davidhigh

Reputation: 15488

Downstream users either use the type declared by you

using my_important_map = std::map<Obj,int,Comparator>;

or better use functions which take a generic map type,

auto some_function(auto const& map_)
{
     //do something with the map and don't care about the ordering
     return map_.find(Obj(1));
}

Upvotes: 1

foo
foo

Reputation: 34

You can typedef the specialised type and use that type inplace of

std::map<...

typedef std::map<Obj,int,Comparator> compMap_t;

inline void add(compMap_t& theMap, Obj const & keyObj)
    ...

Upvotes: 2

Related Questions