📄 ex12_10.cpp
字号:
/* Code for exercise 12.10.
|
| "C++ Solutions--Companion to The C++ Programming Language, Third Edition"
| by David Vandevoorde; Addison-Wesley 1998; ISBN 0-201-30965-3.
|
| Permission to use, copy, modify, distribute and sell this software
| and its documentation for any purpose is hereby granted without fee.
| The author makes no representations about the suitability of this
| software for any purpose. It is provided "as is" without express or
| implied warranty.
`----------------------------------------------------------------------*/
#include <assert.h>
#include <iostream>
#include <map>
#include <typeinfo>
#include <utility> // for pair<>
struct Shape {
virtual ~Shape() {} // Make Shape polymorphic
};
struct Square: Shape {
// ...
};
struct Triangle: Shape {
// ...
};
// We will map pairs of type_info pointers to
// pointers to intersection functions:
using std::type_info;
typedef std::pair<type_info const*, type_info const*> TwoTypes;
typedef bool (*Intersector)(Shape*, Shape*);
// The map needs an ordering relation:
bool operator<(TwoTypes const &a, TwoTypes const &b) {
if ((a.first)->before(*b.first))
return true;
else
if ((*a.first)==(*b.first))
return (a.second)->before(*b.second);
else
return false;
}
typedef std::map<TwoTypes, Intersector> DispatchMap;
DispatchMap& intersector_map() {
static DispatchMap dispatch_table;
return dispatch_table;
}
template<class Type1, class Type2>
void register_intersector(Intersector pf) {
intersector_map()[TwoTypes(&typeid(Type1), &typeid(Type2))] = pf;
}
bool intersect(Shape *a, Shape *b) {
std::cerr << "Looking for intersection function for "
<< typeid(*a).name() << " and " << typeid(*b).name() << ": ";
TwoTypes combination(&typeid(*a), &typeid(*b));
DispatchMap::iterator p = intersector_map().find(combination);
return (*p->second)(a, b);
}
bool squares_intersect(Shape *a, Shape *b) {
std::cerr << "entering squares_intersect.\n";
assert(a && b);
Square *sq1 = dynamic_cast<Square*>(a);
Square *sq2 = dynamic_cast<Square*>(b);
// ... code to determine if *sq1 and *sq2 intersect
return false;
}
bool square_and_triangle_intersect(Shape *a, Shape *b) {
std::cerr << "entering square_and_triangle_intersect.\n";
assert(a && b);
Square *sq;
Triangle *tr;
if ((sq = dynamic_cast<Square*>(a))!=0) {
tr = dynamic_cast<Triangle*>(b);
} else { // *a is a Triangle, *b is a Square
tr = dynamic_cast<Triangle*>(a);
sq = dynamic_cast<Square*>(b);
}
// ... code to determine if *sq and *tr intersect
return false;
}
void register_all_intersectors() {
register_intersector<Square, Square>(squares_intersect);
register_intersector<Square, Triangle>(square_and_triangle_intersect);
register_intersector<Triangle, Square>(square_and_triangle_intersect);
// ...
}
int main() {
register_all_intersectors();
Square s;
Triangle t;
intersect(&s, &s);
intersect(&t, &s);
// ...
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -