ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Вторник
18 января
/1163349
Топик полностью
VladislavS. (12.01.2022 09:23 - 09:29, просмотров: 388) ответил VVB на Знать надо C++ или его стандартную библиотеку? Или Вы не делаете различий между ними?
В основном сам язык. Стандартную библиотеку тоже, желательно. Вот в данном примере применено два шаблона из std. На них построена работа функции. Но вся синтаксическая сложность как раз не в них. А в вариативном шаблоне и вариатвной шаблонной лямбде, а это синтаксис языка, а не стандартной библиотеки. Давайте я поясню что там написано, а вы скажете насколько просто это на С будет написать. 
В метапрограммировании на С++ сложилось такое понятие как список типов. Функция getIndexedPins как раз с ними и работает. Еще раз обращаю внимание, мы находимся в пространстве типов, хотя и оперируем с объектами. Но сами объекты внутри либо пустые, либо константные и используются только как носители типов и констант. Итак, у шаблонна функции getIndexedPins два параметра: - первый параметр это тип, описывающий GPIO-порт; - второй параметр это пачка типов, представляющих из себя, список типов, содержащий типы пинов. Типы параметров ограничены концептами IsGpio и IsPin. Аргументами функции является пачка объектов, из которой выводятся типы пинов в параметры шаблона. Так как мы работаем только с типами, то имя аргументов даже писать не стал. На выходе функции getIndexedPins будет объект, тип которого выводится в процессе компиляции. К тому же это статический метод класса. Поэтому функция возвращает "static consteval auto". Именно тип этого auto для нас будет результатом работы функции. Сам объект потом умрёт при компиляии. В результате работы функции для каждого пина из списка Ps будет проверено, что он принадлежит порту Port и сформирована структура IndexedPin из номера пина в порту и номера пина в списке. Из структур IndexedPin будет сформирован список типов, который и будет возвращаемым значением. Теперь как функция работает внутри. Результатом работы функции будет значение лямды, аргументами которой будет сформированная последовательность целых чисел от 0 до количества пинов в паке Ps "(std::make_index_sequence<sizeof...(Ps)>())". Лямбда у нас шаблонная, из её аргументов будут выведена пачка параметров шаблона Is "<auto... Is>(std::index_sequence<Is...>)". Внутри лямбды у нас будет пачка параметров Ps и равная ей по количеству индексная последовательность Is. Будем эти пачки расширять параллельно с помощью "+ ...". Для каждой пары будем проверять принадлежит ли пин порту "Port::gpio_id==Ps::tgpio::gpio_id" и с помощью std::conditional_t будем добавлять в список либо структуру "TypeList<IndexedPin<Ps::pin, sizeof...(Ps)-Is-1>", либо ничто в виде TypeList<>.


Согласитесь, для описанного количества действий кода с гулькин нос. Боюсь, что на С это в принципе не реализовать.

Ответы