Как создать массив из типов данных в си?



@Nulltiton

Хочу в цикле перебирать типы данных и вычислять их размер, однако столкнулся с проблемой, которая заключается в том, что я не могу использовать тип данных как элемент массива. Подскажите, как реализовать подобную структуру или как обойти данное ограничение. От структуры будет требоваться наличие элементов, которые являются типами данных и индексация элементов.
P.S. пытался реализовать что-то подобное через define, однако, как и ожидалось вместо элемента был подставлен весь диапазон типов данных


Решения вопроса 0


Ответы на вопрос 3



@adressmoeistranici

enum typeid { …}; упоминания типов
индексация упоминаниями ассоциированного массива размеров не лишнее
и конечно явные преобразования данных по месту в switch или через union
Nulltiton, в само перечисление нужно вставить список перечислителей — для области видимости, чтобы их использовать в качестве упоминаний о типе
например назвать enum typeid { int_identity=0, bool_identity, и другие }
каждый чайник знает, а Вы подумали что я предлагаю новую форму синтаксиса с эллипсисом

а в массиве размеров индексация может быть проведена sizes[(size_t)typeid.int_identity]



@wataru

Если массив фиксирован, то можно попробовать через variadic macros это сделать. Но это такой ужас получится. Вам же кроме размеров типов что-то еще делать надо с разными типами. Проще завести enum типов данных, массив из этого, и через switch считать размеры для каждого значения enum.

Edit: был не прав: variadic macro тут не поможет.



@mayton2019

Для того чтобы это работало в духе ООП, все типы должны иметь базовый тип.

Для функциональщины — нужно иметь абстрактный тип Any и коллекции типов которые — суть
подтипы Any. И функцию с pattern matching которая просто кастомизирует size() и прочие
функции. Короче почти ручная работа.

Задача интересная и мне кажется что она реально не решаемая в рамках чистого языка С.
Но если использовать кодо-генерацию (транспилляцию) то можно просто как-то автоматизировать создание
такой логики. Но будет ли это языком С или вообще чем-то другим — большой вопрос.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *