> -- Vlad писал(а):
> А вот и заветный "oberon_cast.h" для тех, кто вынужден писать на C++ (Владимир Лось?) и ему не хватает эффективного "oberon message bus" в C++ :) В решении не используются нестандартные расширения, голый C++. Компилируется VC/gcc/comeau.
Есть ещё одна деталь. В вашей реализации тег типа (указатель на дескриптор типа) внедрён в структуру. То есть размер структуры получается всегда на 4 (или на 8) байтов больше чем сумма размеров её полей. Если мы разместим такую тегированную структуру в массиве, то размер массива увеличится на N * 4 (или на 8) байтов, где N - длина массива. В обероне же этого не произойдёт. Там компилятор помещает тег типа структуры в дескриптор типа массива и никакого перерасхода памяти не происходит. То же самое происходит при внедрении тегированной структуры внутрь другой структуры -- опять её тег помещается в дескриптор типа структуры контейнера.

То есть структура есть сама по себе, а тег её типа есть сам по себе, но компилятор всегда занет откуда его взять. Когда мы пишем в обероне:

PROCEDURE Procedure (VAR r: MyRecord);

то компилятор должен сгенерировать не один аргумент, а два -- тег типа передаётся в процедуру отдельно ("скрытым параметром"). В точке вызова этой процедуры компилятору известно откуда взять тег типа, вот он его автоматически и подставит.