Похожие действия над членами класса
От: steep8  
Дата: 08.09.15 06:45
Оценка:
Есть допустим класс
Point {
    int x;
    int y;
};

И есть две функции, которые обрабатывают вектор Point
typedef std::vector<Point> Points;

void processPointsX(Points& points) {
    std::sort(points.begin(), points.end(), [](const Point& lhs, const Point& rhs) {return lhs.x < rhs.x;});
    for (auto point: points) {
    if (point.x < SIZE) {
        point.x = SIZE;
    }
    ....
}

void processPointsY(Points& points) {
    std::sort(points.begin(), points.end(), [](const Point& lhs, const Point& rhs) {return lhs.y < rhs.y;});
    for (auto point: points) {
    if (point.y < SIZE) {
        point.y = SIZE;
    }
    ....
}

Функции похожи и захотелось избавить от копи-паста, но пока не понятно как сделать это попроще.
По идее можно вынести из сортировки функтор сравнения в параметры функции, но что далать далее с if...
Или может проще оперировать не координатами точки в функции, а как то обрабатывать Point на другом уровне.
Что то глаз замылился, пока не понял как лучше.
Re: Похожие действия над членами класса
От: uzhas Ниоткуда  
Дата: 08.09.15 07:12
Оценка: 8 (2) +2
Здравствуйте, steep8, Вы писали:

S>Функции похожи и захотелось избавить от копи-паста, но пока не понятно как сделать это попроще.


конкретно в этом случае я бы перешел к проекциям точек и работал с ними. получение проекции из точки с помощью внешней стратегии
например, так: http://ideone.com/LuV8VK
Re: Похожие действия над членами класса
От: ArtDenis Россия  
Дата: 08.09.15 07:25
Оценка: 18 (4)
Здравствуйте, steep8, Вы писали:

S>Или может проще оперировать не координатами точки в функции, а как то обрабатывать Point на другом уровне.

S>Что то глаз замылился, пока не понял как лучше.

Так этож классика С++. Стыдно такое не знать

using PointField = int Point::*;

void processPoints(Points& points, PointField field)
{
    std::sort(points.begin(), points.end(), [field](const Point& lhs, const Point& rhs) {return lhs.*field < rhs.*field;});
    for (auto &point : points) // не забываем &, чтобы потом не удивляться, что данные не меняются )
    {
        if (point.*field < SIZE)
        {
            point.*field = SIZE;
        }
    }
}

processPoints(points, &Point::x);
processPoints(points, &Point::y);
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Отредактировано 08.09.2015 7:27 ArtDenis . Предыдущая версия .
Re[2]: Похожие действия над членами класса
От: Kingofastellarwar Украина  
Дата: 24.09.15 19:24
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, steep8, Вы писали:


S>>Или может проще оперировать не координатами точки в функции, а как то обрабатывать Point на другом уровне.

S>>Что то глаз замылился, пока не понял как лучше.

AD>Так этож классика С++. Стыдно такое не знать


AD>
AD>using PointField = int Point::*;

AD>void processPoints(Points& points, PointField field)
AD>{
AD>    std::sort(points.begin(), points.end(), [field](const Point& lhs, const Point& rhs) {return lhs.*field < rhs.*field;});
AD>    for (auto &point : points) // не забываем &, чтобы потом не удивляться, что данные не меняются )
AD>    {
AD>        if (point.*field < SIZE)
AD>        {
AD>            point.*field = SIZE;
AD>        }
AD>    }
AD>}

AD>processPoints(points, &Point::x);
AD>processPoints(points, &Point::y);

AD>


а мс компиляторы это поддерживают? совсем недавно мечтал о такой фигне а тут нате
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[3]: Похожие действия над членами класса
От: ArtDenis Россия  
Дата: 25.09.15 04:25
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>а мс компиляторы это поддерживают? совсем недавно мечтал о такой фигне а тут нате


Что именно? Ссылка на поле класса или структуры — это очень старая фича C++. Если не использовать фишки C++11, то для совсем старых компиляторов надо писать так:

typedef int Point::*PointField;


Но вариант C++11 с using красивее и понятнее.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Отредактировано 25.09.2015 4:26 ArtDenis . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.