Пользовательская функция сравнения C ++ с шаблоном в качестве параметра функции

Я пытаюсь реализовать / использовать интерфейс в стиле компаратора, подобный тому, который вы найдете в Java, который позволил бы мне передать универсальный тип компаратора в функцию и использовать его для сортировки набора данных.

Это потому, что мне нужно множество различных функций сравнения, и я хочу иметь возможность передать ту, которая мне нужна, в функцию сортировки.

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

void Population::sort(const std::shared_ptr<Comparator<Solution>>& comparator)
{
std::sort(data.begin(), data.end(), comparator.get());
}

И интерфейс компаратора, который я пытался реализовать

template <typename T> class Comparator : public std::binary_function<T,T,bool>
{
public:
virtual ~Comparator ();
virtual bool operator() ( const T &o1, const T &o2  ) = 0;
};

Вероятно, что-то очевидно, что я делаю неправильно, потому что я не очень хорошо знаю C ++.

Ура!

1

Решение

Если вам явно не нужно изменять предикат сравнения во время выполнения, я бы решил сделать функцию Population :: sort функцией шаблона:

struct Person
{
std::vector<int> v;

template<typename P>
void sort(P& p)
{
std::sort(v.begin(), v.end(), p);
}
};

Это тогда дает вам широкий спектр вариантов для вашего предиката. Такие как:

bool mycompare(int a, int b)
{
return a < b;
}

struct predicate
{
bool operator()(int a, int b)
{
return a < b;
}
};

struct myclass
{
bool function(int a, int b)
{
return a < b;
}
};

int main()
{

Person p;

// you can use a lambda
p.sort([](int a, int b){return a < b;});
// you can use a functor
predicate pred;
p.sort(pred);
// you can use a free function
p.sort(mycompare);
// you can bind to a class member function
myclass c;
p.sort(std::bind(&myclass::function, &c, std::placeholders::_1, std::placeholders::_2));
std::copy(p.v.begin(), p.v.end(), std::ostream_iterator<int>(std::cout));
}

Использование таких шаблонных функций обеспечивает большую гибкость.

2

Другие решения

Первое: вы должны правильно реализовать свой компаратор. Что-то вроде:

template <typename T>
struct Comparator : public std::binary_function<T,T,bool>
{
bool operator()(const T& o1, const T& o2)
{
return o1 < o2;
}
}

Второе: вы должны поместить экземпляр вашего компаратора в std :: sort:

std::sort(data.begin(), data.end(), Comparator<Solution>());
0