Функция-член как компаратор карт?


Я знаю, как создать функцию, которая служит в качестве пользовательского компаратора карт:

std::map<std::string, std::string, bool (*)(std::string, std::string)> myMap(MapComparator);

bool MapComparator(std::string left, std::string right)
{
    return left < right;
}

Но я не знаю, как сделать то же самое с членом функции:

bool MyClass::MapComparator(std::string left, std::string right)
{
    return left < right;
}
1 2

1 ответ:

У вас есть несколько вариантов:

В C++11 можно использовать лямбду:

std::map<std::string, std::string, bool (*)(std::string, std::string)> myMap(
    [](string lhs, int rhs){ // You may need to put [this] instead of [] to capture the enclosing "this" pointer.
       return MapComparator(lhs, rhs); // Or do the comparison inline
    });

Если функция статична, используйте синтаксис :::

class MyClass {
public:
    static bool MyClass::MapComparator(std::string left, std::string right);
};
...
std::map<std::string, std::string, bool (*)(std::string, std::string)> myMap(MyClass::MapComparator);

Если функция нестатична, создайте статическую оболочку, член или не член, и вызовите из нее функцию-член.