Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
inline const char* collide(game_object* obj1, game_object* obj2)
{
if (space_ship* sh1 = dynamic_cast<space_ship*>(obj1))
if (space_ship* sh2 = dynamic_cast<space_ship*>(obj2))
return collide_sh_sh(sh1, sh2);
else if (asteroid* as2 = dynamic_cast<asteroid*>(obj2))
return collide_sh_as(sh1, as2);
else
return collide_go_go(sh1, obj2);
struct C : asteroid, space_ship {};
typedef void f1_type(game_object*);
typedef void f2_type(C*);
void f(game_object*);
void f(C*);
game_object* go;
auto mm = make_multimethod((f1_type*)f, (f2_type*)f);
mm(go);
if (C* c = dynamic_cast<C*>(go)) // dynamic_cast способен производить downcast по ромбовидным иерархиям
f(c); // нет неоднозначности, разрешение перегрузки в void f(C*)
else
f(go); // нет неоднозначности, разрешение перегрузки в void f(game_object*);
Как видно, накладные расходы во время выполнения представлены в лучшем случае 2-мя dynamic_cast, в худшем — 4-мя.
Мультиметоды в C++. Библиотечная реализация. Введение в MML