У меня есть классический пример иерархии фигур ...
struct Shape { // abstract type
Shape (int x, int y);
int x;
int y;
};
struct Rectangle : public Shape {
Rectangle (int x, int y, int w, int h);
int w;
int h;
};
struct Circle : public Shape {
Circle (int x, int y, int r);
int r;
};
контейнер Shapes, заполненный прямоугольниками и кругами
std::list<Shape*> container;
и функции печати (в моем случае это функции обнаружения столкновений)
void print_types (Shape&, Shape&) {
std::cout << "Shape, Shape" << std::endl;
}
void print_types (Rectangle&, Rectangle&) {
std::cout << "Rectangle, Rectangle" << std::endl;
}
void print_types (Rectangle&, Circle&) {
...
Конечно, когда я это делаю:
std::list<Shape*> it;
Rectangle r (0, 0, 32, 32);
for (it = container.begin(); it != container.end(); it++)
print_types(r, **it);
Я не хочу печатать только линии «Форма, Форма». Я знаю виртуальные методы, dynamic_cast и посетителей. Но есть ли какой-нибудь элегантный способ выйти из этого без этих решений и сохранить мои внешние функции?
dynamic_cast
. - person Oliver Charlesworth   schedule 04.05.2011