В сообщении от 29 Май 2006 16:28 Nikita V. Youshchenko написал:
Навскидку - я не знаю, как средствами чистого Си++ реализовать доступ к полям сообщения - с учётом того, что по синтаксису mm языка там используется операция ".", имена полей - свои для каждого типа сообщений, и одна и та же msg переменная может хранить сообщения любого типа.
По-моему, в ММ и так есть базовый для всех тип MESSAGE, на которым строится иерархия типов сообщений. При этом для того, чтобы изменился "распознаваемый" тип переменной, используется конструкция assume -- вместо неё с успехом может быть тот или иной cast (ну или assume может разворачиваться в cast макросом).
Итак, конструкция в mm:
... assume m == message X; m.x1 = 5; m.x2 = 6; ... assump m == message Y; m.y1 = 7; m.y2 = 8; ...
Причём это в одном блоке кода. Корректная с точки зрения mm-языка конструкция. Как предлагается построить средство типа "локальный препроцессор" - без памяти о том что где-то раньше был assume для m, который ничем не был перекрыт - которое правильно в первых двух присваиваниях сделает cast на message_X, а во втором - на message_Y?
Если ММ-язык позволяет использовать нечто вроде
receive(m,i); assume m == message X; int a = m.a; assume m == message Y; int b = m.b;
то это явный design flaw синтаксиса языка, поскольку я с трудом представляю ситуацию, в которой это может сработать. Должен быть динамический контроль типа, так, чтобы assume на "неправильный тип" не работал. Это можно и нужно делать при помощи dynamic_cast.
Если ты посмотришь на то, как assume используется, то парадигма такая:
receive(m,i); if(m == message X) { assume m == message X; ... } if(m == message Y) { assume m == message Y; ... }
И только так!
Ну максимум что нужно будет сделать -- использовать m->x1 вместо m.x1 :-) m == message X => dynamic_cast<X>(m) assume m == message X => m = dynamic_cast<X>(m)
Я думаю, что Володя сможет предложить более красивое и полное решение, но нужно ли? Принципиальных проблем тут нет.
Я полагаю, что по части синтаксиса тут в полной мере работает правило 80/20, т.е. на 20% поддержки синтаксиса потребуется 80% всех усилий. А то и на 5%. Так что проще слегка изменить синтаксис :-)
Костя.