Help needed to overload function template.
Hi,
I want to have two template functions erase_if, one for regular
containers and another for associative containers.
If I leave the code as below the compiler will complain about
ambiguity.
I tried to use template template parameters but could not figure it
out in a proper way.
Any suggestions ?
template <class Container, class Predicate>
Container& erase_if (Container& c, Predicate& p)
{
c.erase (std::remove_if (c.begin (), c.end (), p), c.end ());
return c;
}
template<class MapClass, class Predicate>
void erase_if (MapClass& map, Predicate& p)
{
typedef typename MapClass::iterator iterator;
iterator it = map.begin ();
const iterator end = map.end ();
while (it != end);
{
iterator tmp=it++;
if (p (*tmp))map.erase (tmp);
}
}
I managed to get this to compile (but not the code to use it):
template<typename Key, typename T, template <typename _Key = Key,
typename _T = T, typename Compare = std::less<Key>,
typename Alloc = std::allocator<std::pair<const Key, T> >
class MapClass,
class Predicate>
void erase_if (MapClass<>& map, Predicate& p)
{
typedef typename MapClass<>::iterator iterator;
iterator it = map.begin ();
const iterator end = map.end ();
while (it != end);
{
iterator tmp=it++;
if (p (*tmp))map.erase (tmp);
}
}
It is very ugly and I was not even able to use it, the code below
resulted in no match for function erase_if:
#include <boost/test/unit_test.hpp>
#include "algorithm_util.h"
#include <map>
#include <string>
typedef std::pair<int, std::string> MapEntry;
struct IsDigit : public std::unary_function<MapEntry, bool>
{
bool operator() (MapEntry p) {return isdigit (p.first);}
};
typedef std::map<int, std::string> Map;
BOOST_AUTO_TEST_SUITE(algorithm_util_suite)
BOOST_AUTO_TEST_CASE(erase_if_map)
{
Map map;
map[0] = "a";
map[1] = "1";
map[2] = "c";
cpplib::erase_if<int, std::string, Map, IsDigit> (map, IsDigit());
// I would like to be able to call it this way: erase_if<Map,
IsDigit>(map, IsDigit());
// Or preferebly erase_if (map, IsDigit()); Hoping the compiler
would be smart enough to figure it out.
BOOST_CHECK_EQUAL ("a", map[0]);
BOOST_CHECK_EQUAL ("c", map[1]);
}
BOOST_AUTO_TEST_SUITE_END ()
Thank you in advance for your attention !
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]