Работа с функциональными объектами

std::sort шаблон, параметризованный над классом Compare Сама функция принимает объект этого класса в качестве аргумента и «вызывает» его для сравнения элементов контейнера, подлежащего сортировке.

Я предполагаю, что важно, чтобы мы могли дать сортировке конкретный объект, а не просто позволить сортировке создать сам объект сравнения. (Если нет, пожалуйста, поправьте меня.)

Теперь предположим, что мы хотим реализовать функцию foo который принимает в качестве входных данных vector<T> и функция сравнения для T:

template <class T, class Compare>
bool foo(const vector<T>& v, Compare comp);

В рамках этой реализации мы хотим отсортировать другой вектор, содержащий пары T и скажи, intто есть сортировать vector<pair<T, int>>, Но мы хотим отсортировать этот вектор на основе T только компонент. Это означает, что мы хотим поднять данный ордер на T на заказ pair<T, int> и передать это std::sort,

Как это можно сделать без использования лямбд? Моя проблема в том, что я не вижу способа поднять Compare объект за T одному для pair<T, int>, Я могу только поднять Compare учебный класс а затем построить объект этого, что означает, что foo будет полностью игнорировать его comp аргумент.

Благодарю.

2

Решение

Можете ли вы определить локальную структуру внутри функции, например?

template <class T, class Compare>

bool foo(const vector<T>& v, Compare comp)
{
struct NewCompare
{
const Compare &rc;
NewCompare( const Conpare &comp ) : rc( comp ) {}
NewCompare( const NewCompare &comp ) : rc( comp.tc ) {}
bool operator ()( const std::pair<T, int> &p1, const std::pair<T, int> &p2 ) const
{
return rc( p1.first, p2.first );
}
};

//...
}

Или вы можете написать общий функциональный адаптер.

1

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