Передача временных объектов по ссылке

У меня есть два класса: круг и точка

Класс Circle содержит Dot, а Dot содержит int. Circle имеет функцию getDot(), а Dot имеет функцию lessThan(Dot&).

Я хочу отсортировать массив Circles, elems[], по значениям int внутри Dot. Если у меня есть Circle Circle, который я хочу сравнить с каким-либо значением в массиве, мне нужна строка, которая выполняет следующие действия:

elems[0].getDot().lessThan(circ.getDot())

Но это не скомпилируется... Я могу решить проблему с помощью временного

Dot dt = circ.getDot()

и прохождение

elems[0].getDot().lessThan(dt)

но это кажется ненужным копированием. Есть ли более эффективный способ решить эту проблему?

К сожалению, я ограничен использованием lessThan (точка &) для сравнения, но я могу изменить его содержимое.

Ошибка компилятора: error: неверная инициализация неконстантной ссылки типа 'Dot &' из значения r типа 'Dot' cout<

1 ответ

Решение

Пример:

#include <vector>
#include <algorithm>

struct Dot
{
    Dot(int i) : value_(i) {}
    bool lessThan(Dot const& other) const
    {
        return value_ < other.value_;
    }

    int value_;
};

struct Circle
{
    Circle(Dot dot = Dot(0))
    : dot_(dot)
    {
    }

    const Dot& getDot() const { return dot_; }

    Dot dot_;
};


void sortCircles(std::vector<Circle>& circles)
{
    auto order = [](Circle const& l, Circle const& r)
    {
        return l.getDot().lessThan(r.getDot());
    };
    std::sort(circles.begin(), circles.end(), order);
}
Другие вопросы по тегам