Как использовать unordered_set с функцией сравнения?

Я написал свою собственную функцию сравнения для третьего параметра шаблона std::unorderd_set. Моя функция

static bool HasSamePosition(const Node& a, const Node& b);

в классе Node. Теперь я пытаюсь использовать эту функцию в моем неупорядоченном наборе,

std::unordered_set<Node, std::hash<Node>, bool(*)(const Node& a, const Node& b)> closedlist(&Node::HasSamePosition);

но это не работает Ошибка состоит в том, что ни один экземпляр конструктора не соответствует списку аргументов. Что мне не хватает?

2 ответа

Решение

Ну, компилятор прав. Там нет конструктора, который позволяет вам только передать KeyEqual в качестве параметра. Вам нужно использовать другой конструктор (см. Здесь) или изменить тип вашей функции.

Например, вы можете использовать вспомогательную структуру, которая обернет ваш вызов HasSamePosition и переопределит operator()(const Node& a, const Node& b)

struct Node{
    static bool HasSamePosition(const Node& a, const Node& b);
};

struct NodeEqual
{
    bool operator()(const Node& a, const Node& b) { return Node::HasSamePosition(a, b); }
};

int main()
{
    std::unordered_set<Node, std::hash<Node>, NodeEqual> closedlist();
}

Проще использовать класс:

class Node
{ 
    public:
        class HasSamePosition
        {
            bool operator()(const Node& a, const Node& b)
            { 
                // Put here content of your HasSamePosition function
            }
        };
    ....
};

std::unordered_set<Node, std::hash<Node>, Node::HasSamePosition> closedlist;
Другие вопросы по тегам