Я пытаюсь определить тип unordered_map, который имеет пользовательскую хеш-функцию и функцию сравнения равенства. Прототипы функции этих функций следующие:
//set<Vertex3DXT*> is the type of the key; Cell3DXT* is the type of the value
size_t VertexSetHashFunction(set<Vertex3DXT*> vertexSet); //hash function
bool SetEqual(set<Vertex3DXT*> a, set<Vertex3DXT*> b); //equality
Мне объявили этих прототипов функции, и затем я пытаюсь объявить тип следующим образом:
typedef std::tr1::unordered_map<set<Vertex3DXT*>, Cell3DXT*, VertexSetHashFunction, SetEqual> CellDatabaseMapType;
Но это говорит, что VertexSetHashFunction и SetEqual не являются допустимыми шаблонными аргументами типа. Документация сбивает с толку, потому что она не говорит точно, что вводит аргументы шаблона, как, предполагается, - я, как просто предполагается, даю ей функцию, как я сделал здесь или являюсь там некоторым другим видом объекта, который инкапсулирует функцию (потому что документация действительно говорит о "типе объекта хеш-функции")?
Эти функции должны быть объявлены как оператор () в классе, к сожалению. Например, так:
class VertexSetHashFunction {
public:
::std::size_t operator ()(const ::std::set<Vertex3DXT*> &vertexSet) const;
};
class SetEqual {
public:
bool operator ()(const ::std::set<Vertex3DXT*> &a, const ::std::set<Vertex3DXT*> &b) const;
};
Вам не обязательно изменять аргументы, чтобы они были ссылками const, но я бы настоятельно рекомендовал это сделать. Создание копии ::std::set относительно дорого, и вы не должны делать этого, если только это не является абсолютной необходимостью.
Конечная const - это просто потому, что оператор на самом деле не изменяет состояние класса, в основном потому, что его нет. Просто приятно сказать об этом явно.
В качестве альтернативы вы можете определить свою собственную специализацию шаблона ::std::hash. Я бы на самом деле рекомендовал это сделать, если есть один стандартный способ, которым вы хотите хэшировать конкретный набор, потому что этот шаблон используется по умолчанию, если вы не предоставите хэш-функцию для unordered_map
или unordered_set
и всего остального, что требует хэш-функции.
Вам нужны функторы.
struct VertexSetHashFunction {
size_t operator() (const set<Vertex3DXT*>& vertexSet) const { return /*whatever*/; }
};
struct SetEqual {
bool operator() (const set<Vertex3DXT*>& a, const set<Vertex3DXT*>& b) const { return /*whatever*/; }
};