que estoy tratando de hacer lo siguiente:Cómo hacer unordered_map impulso para soportar el peso mosca <string>
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
Pero el compilador se queja: "C2665 de error: 'boost :: hash_value': ninguno de los 17 sobrecargas podía convierta todos los tipos de argumentos ".
Pero he definido la siguiente función:
std::size_t hash_value(const boost::flyweight<std::string> & b)
{
boost::hash<std::string> hasher;
const std::string & str = b.get();
return hasher(str);
}
bool operator==(const boost::flyweight<std::string>& f, const boost::flyweight<std::string> & second)
{
return f.get() == second.get();
}
Pero Indiferente compilar.
¿Qué debo hacer para aumentar boost unordered_map para admitir flyweight?
[EDIT] lo tengo para trabajar con el siguiente código:
struct flyweight_hash
{
std::size_t operator()(const boost::flyweight<std::string> &elm) const
{
boost::hash<std::string> hasher;
const std::string & str = elm.get();
return hasher(str);
}
};
y se lo pasó como un parámetro de plantilla para la construcción del mapa:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
En este caso yo No entiendo cómo sobrecargar hash_value no funcionó.
Solo es malo porque 'hasher predeterminado de' boost :: unordered_map' no parece desencadenar ADL by 'using boost :: hash_value; return hash_value (clave); '. Sin embargo, no puedo verificar eso en este momento. – Xeo
@Xeo El hasher predeterminado debe ser 'boost :: hash' y no debe ser específico de' unordered_map'. Al menos el doctor lo dice. – pmr
Claro, pero eso no cambia que las llamadas habilitadas para ADL no parezcan ser utilizadas. – Xeo