As described in my comment, the actual problem is that the predicate provided to find_if
is required to have an operator()
, not some function with a name similar to the class name.
C++03 version:
#include <map>
#include <functional>
#include <string>
#include <algorithm>
namespace Bill
{
enum CodeCurrency
{
A, B, C
};
typedef std::map<CodeCurrency, std::string> currency_code_map_t;
currency_code_map_t const& currency_code_map()
{
static currency_code_map_t m;
return m;
}
}
struct IsCurrency
: std::binary_function< Bill::currency_code_map_t::value_type, std::string,
bool >
{
bool operator()(Bill::currency_code_map_t::value_type const& element,
std::string const& expected) const
{
return element.second == expected;
}
};
int main()
{
std::string currency = "RUB";
Bill::currency_code_map_t::const_iterator my_currency =
std::find_if( Bill::currency_code_map().begin(),
Bill::currency_code_map().end(),
bind2nd(IsCurrency(), currency) );
}
C++11 version:
#include <map>
#include <functional>
#include <string>
#include <algorithm>
namespace Bill
{
enum CodeCurrency
{
A, B, C
};
typedef std::map<CodeCurrency, std::string> currency_code_map_t;
currency_code_map_t const& currency_code_map()
{
static currency_code_map_t m;
return m;
}
}
int main()
{
std::string currency = "RUB";
auto check = [¤cy](Bill::currency_code_map_t::value_type const& element)
{ return element.second == currency; };
auto my_currency =
std::find_if( Bill::currency_code_map().cbegin(),
Bill::currency_code_map().cend(),
check );
}
Note this algorithm is O(N). You might want to consider using something like a boost::bimap
if you need to find elements often, which can be O(logN).