Виртуальные методы как функция Comp для сортировки - PullRequest
4 голосов
/ 26 апреля 2010

Я новичок в C ++ и пытаюсь использовать функцию std :: sort для сортировки вектора решений.

Код выглядит примерно так (список решений представляет собой * вектор):

void SolutionSet::sort(Comparator &comparator) {

 std::sort(solutionsList_->begin(), solutionsList_->end(), &comparator::compare);

}

Параметр компаратора является экземпляром дочернего класса Comparator, а метод сравнения является виртуальным в классе Comparator и реализуется всеми дочерними классами Comparator.

И я хочу использовать эту функцию в качестве функции сравнения в std: sort ().

Возможно ли это?

Если это так, может кто-нибудь сказать мне, как? Потому что с предыдущим кодом это не работает.

Если я не прояснил себя, просто спросите!

Спасибо, ребята!

Ответы [ 2 ]

5 голосов
/ 26 апреля 2010

Функторы STL должны быть мономорфными, поскольку функторы STL передаются по значению .

Если вам нужно полиморфное поведение, вам нужно обернуть эту функциональность в мономорфный класс:

т.е.

struct MonomorphicWrapper : std::binary_function<Solution, Solution, bool>
{
    bool operator()(const Solution& lhs, const Solution& rhs)
    {
        return lhs.compare(rhs);
    }
};
1 голос
/ 26 апреля 2010

Вы должны использовать std :: bind в качестве Comparator :: compare для метода экземпляра, поэтому в качестве параметра необходим объект Comparator.

Примерно так:

std::sort (...., std::bind (&Comparator::compare, comparator));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...