Есть допустим класс
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 на другом уровне.
Что то глаз замылился, пока не понял как лучше.
Здравствуйте, steep8, Вы писали:
S>Функции похожи и захотелось избавить от копи-паста, но пока не понятно как сделать это попроще.
конкретно в этом случае я бы перешел к проекциям точек и работал с ними. получение проекции из точки с помощью внешней стратегии
например, так:
http://ideone.com/LuV8VK
Здравствуйте, 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);
Здравствуйте, 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 г.
Здравствуйте, Kingofastellarwar, Вы писали:
K>а мс компиляторы это поддерживают? совсем недавно мечтал о такой фигне а тут нате
Что именно? Ссылка на поле класса или структуры — это очень старая фича C++. Если не использовать фишки C++11, то для совсем старых компиляторов надо писать так:
typedef int Point::*PointField;
Но вариант C++11 с using красивее и понятнее.