Навскидку - я не знаю, как средствами чистого Си++ реализовать доступ к полям сообщения - с учётом того, что по синтаксису 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?
Да и отдельный cast не очень понятен - что в строке "m.x1 = 5" ты сделаешь макросом? Варианты с изменением синтаксиса языка не канают :).