Solución al acertijo de C++
Hace unos días planteé un problema, y como nadie lo ha resuelto, plantearé la solución. Como recordaréis, quería hacer una función que retornara el centro de un rectángulo que podría ser de tipo
Y dije que tenía un problema. ¿Qué pasa si por ejemplo
Nótese cómo ahora la función modifica
Así, por ejemplo, podríamos tener:
Espero que no se hagan muy pesados este tipo de entradas...
Gdk::Rectangle
ó Pango::Rectangle
, por lo que creé la siguiente función template:
template <class Rect> Rect
middleOfRect(Rect& r)
{
Rect _r;
_r.set_x(r.get_x() + r.get_width() / 2);
_r.set_y(r.get_y() + r.get_height() / 2);
return _r;
}
Y dije que tenía un problema. ¿Qué pasa si por ejemplo
Rect
es "const Gtk::Rectangle? El código no funcionará, porque como se ve, dentro de la función se crea un elemento de tipo
Rect
, que no se puede modificar. Como C++ no tiene sintaxis para referirse a un tipo «sin const» dentro de un template, la única solución que se me ocurre es modificarla de tal manera que dependa de dos argumentos, y que se retorne uno de ellos modificado:
template <class Rect1, class Rect2> void
middleOfRect(Rect1& r, Rect2& rdest)
{
rdest.set_x(r.get_x() + r.get_width() / 2);
rdest.set_y(r.get_y() + r.get_height() / 2);
}
Nótese cómo ahora la función modifica
rdest
, que obligatoriamente tiene que ser no-const, y que no se retorna ningún elemento; sólo se modifica el parámetro rdest
.Así, por ejemplo, podríamos tener:
Gdk::Rectangle middle;
const Gdk::Rectangle& r = element.boundingRect();
middleOfRect( r, middle );
// usar "middle" aquí
Espero que no se hagan muy pesados este tipo de entradas...