С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/36: Рейтинг темы: голосов - 36, средняя оценка - 4.64
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501

Библиотека метапрограммирования

10.12.2011, 15:08. Показов 7478. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Увлекшись метапрограммированием, начатым в предыдущей теме, я решил написать небольшую библиотеку метафункций.

Изначально всё это предназначалось для работы с кортежами, но на самом деле оно применимо к любым шаблонным классам. В том числе возможна совместная работа с библиотекой "Boost.MPL" (но очень осторожная, т.к. в "Бусте" не используются списки типов переменной длины).

Отличие от аналогов, в том числе того же "Boost.MPL" состоит, в основном, в том, что результат всех метафункций предсказуем (в "Бусте" он неопределён). Второе отличие — отсутствие теоретических ограничений на количество типов в шаблонах.

Есть и новшества: я ввёл новый результат метафункции — шаблон, он же "pattern" (т.к. "template" уже является ключевым словом). Смысл его следует из названия: это не тип ("type") и не значение ("value"), а шаблон класса, который может быть в дальнейшем конкретизирован новыми типами (см. метафункцию "get_pattern").

Это первый вариант библиотеки, не влючающий итераторы. Они появятся в следующей версии.
Прошу ознакомиться, кому не лень, и с нетерпением жду отзывов и предложений.

Исходники, так же доступны и на GitHub: https://github.com/izvolov/Meta
клонировать так: git clone git://github.com/izvolov/Meta.git
Вложения
Тип файла: zip meta.zip (46.7 Кб, 48 просмотров)
6
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2011, 15:08
Ответы с готовыми решениями:

Применение метапрограммирования
Доброго времени суток форумчане. Собственно говоря, как часто применимо метапрограммирование в современном мире разработок на C++. И имеет...

Паттерны метапрограммирования шаблонов
Нигде не могу найти литературу по паттернам метапрограммирования шаблонов, александреску не предлагать)) конкретно не могу понять как...

Дорожная библиотека + основная библиотека процессов
Доброго времени! Пытаюсь совместить в одной модели дорожную библиотеку и библиотеку моделирования процессов следующим образом. По дороге...

54
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.12.2011, 17:23
volovzi, Интересно... Но почему бы не использовать boost вместе? Например meta::select - тот же mpl::if_.
are_equal == boost::is_same.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 17:31  [ТС]
ForEveR, ждал этого вопроса.
Библиотека вся весит пока что сотню килобайт, поэтому не хочется тащить за ней многомегабайтный "Буст". К тому же мне не нравятся начальные и завершающие подчёркивания в именах .
А по поводу "are_equal" — это я забыл убрать. Во-первых, в библиотеке она не используется, а во-вторых, уже есть "std::is_same".

Кстати, "select" тоже, вроде, в данный момент не используется...
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.12.2011, 17:40
volovzi, Но вообще очень даже интересная либа. Развивайте обязательно. Немного позже попробую ее использовать.
1
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 17:45  [ТС]
ForEveR, спасибо. К следующей версии допишу исчерпывающие комментарии, допилю итераторы и, может, сделаю какую-нибудь документацию.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.12.2011, 21:42
volovzi, залей исходники на как-нибудь github, что ли.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 22:30  [ТС]
niXman, дык там платы, вроде, требуют.
А вообще, да, надо найти, где разместить исходники. Я над этим думаю.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.12.2011, 01:16
там есть и free аккаунты. или на гуглкод посмотри.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
11.12.2011, 02:31  [ТС]
niXman, уже разобрался, скоро сделаю.

Добавлено через 39 минут
Ну вот как-то так:
https://github.com/izvolov/Meta

Добавлено через 35 минут
Всё, теперь всё должно быть правильно.
Товарищи модераторы, добавьте, пожалуйста, ссылку в первое сообщение темы.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.12.2011, 06:05
get_pattern<> - хорошая идея

volovzi, может тему перенести в https://www.cyberforum.ru/cpp-experts/ ?
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
11.12.2011, 15:58  [ТС]
niXman, не стоит. Тот раздел закрытый, а мне не хотелось бы ограничивать комментирование в этой теме — тут и так народу немного.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
19.12.2011, 00:37  [ТС]
Обновил репозиторий.
Добавлены комментарии, читаемые сообщения об ошибках и немного итераторных метафункций.
К сожалению, итераторы навели в библиотеке лёгкий беспорядок — их пришлось запихивать в отдельное пространство имён, и я ещё не решил, как их лучше структурировать: либо создавать в каждом разделе дополнительную папку с итераторными метафункциями, либо выделить все итераторы в отдельный блок, в котором будут свои разделы, либо оставить так, как сейчас — всё в куче.

Далее, в продолжение развития темы новой концепции шаблонов ("patterns") появился контейнер шаблонов — "pattern_list<...>", который пригодился как раз в итераторах.

И, поскольку изначально всё создавалось для работы с кортежами, написал метафункцию, распаковывающую кортеж и передающую его в функцию или функтор так, как будто это не кортеж, а набор отдельных переменных. Она работает, но мой компилятор, к сожалению, её не тянет, поэтому она не в проекте, а отдельно по ссылке: http://liveworkspace.org/code/... 4a54a4a227
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.12.2011, 20:00
Цитата Сообщение от volovzi Посмотреть сообщение
компилятор, к сожалению, её не тянет
это как понимать?

Добавлено через 12 часов 53 минуты
volovzi, идея такая есть... добавь еще шаблон создания кортежа из произвольного набора индексов типов.
типа:
C++
1
2
typedef std::tuple<int, bool, double> tuple0;
typedef typename meta::seq<tuple0, 2, 0>::type tuple1; // <double, int>
было бы весьма юзабильно в алгоритмах.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
19.12.2011, 20:15  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
это как понимать?
В настоящий момент не существует ни одного компилятора, полностью поддерживающего новый стандарт. Например, gcc не понимает спецификаторы "override" и "final", а мой — apple llvm — не компилирует вышеуказанную программу. Происходит ошибка внутри компилятора.

Добавлено через 12 часов 53 минуты
volovzi, идея такая есть... добавь еще шаблон создания кортежа из произвольного набора индексов типов.
типа:
C++
1
2
typedef std::tuple<int, bool, double> tuple0;
typedef typename meta::seq<tuple0, 2, 0>::type tuple1; // <double, int>
было бы весьма юзабильно в алгоритмах.
Интересная задачка. "В лоб" делается легко, а вот чтобы было эффективно — надо подумать.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.12.2011, 20:27
Цитата Сообщение от volovzi Посмотреть сообщение
gcc не понимает спецификаторы "override" и "final"
gcc-4.7.0 понимает. тестовые версии для вендус можешь найти у меня в подписи.
релиз выйдет в феврале.

Добавлено через 2 минуты
Цитата Сообщение от volovzi Посмотреть сообщение
gcc не понимает спецификаторы "override" и "final"
а зачем в метапрограммировании могли они понадобиться? оО
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
19.12.2011, 20:40  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
gcc-4.7.0 понимает. тестовые версии для вендус можешь найти у меня в подписи.
релиз выйдет в феврале.
4.7 — будет понимать. В феврале, когда выйдет. А последняя стабильная на данный момент 4.6 — не понимает.

Добавлено через 2 минуты

а зачем в метапрограммировании могли они понадобиться? оО
Незачем. Просто пример.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
22.12.2011, 21:48  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

"По заявкам трудящихся" написал метафункцию "subset", позволяющую создавать новый класс из произвольного подмножества типов некоторого класса. К сожалению, по-умному сделать пока что не удалось, поэтому время работы — O(m * n), где n — число типов в исходном шаблоне, а m — размер формируемого подмножества.
Тем не менее, поиски лучшего результата продолжаются.
Изменения вступят в силу со следующего коммита.

Добавлено через 23 часа 53 минуты
Не прошло и дня, как мне удалось сильно продвинуться.
Буквально только что написал метакласс, который является полноценным двоичным деревом поиска со всеми его алгоритмическими характеристиками. Правда, пока что нет балансировки (не было времени, спешил сообщить об успехах), но я думаю, что раз есть принципиальная возможность создать дерево, то и отбалансировать его получится.
Надеюсь, эта штука поможет усовершенствовать некоторые не очень быстрые алгоритмы.
3
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
22.12.2011, 22:25
а заливать на гитхаб не собираешься?
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
23.12.2011, 22:18  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

niXman, собираюсь, конечно!
Но нужно сначала придумать, как это оформить и структурировать. Не сегодня, так завтра обязательно выложу.

Добавлено через 22 минуты
Тут ведь вот какая проблема возникла: до сих пор библиотека была рассчитана на работу с типами шаблонов, а дерево — реальный контейнер времени компиляции. Поэтому такие метафункции, как, например, "insert", будут иметь совершенно разный смысл. В первом случае это создание новой конкретизации шаблона с новыми типами, а во втором — внесение значения в контейнер, количество шаблонных параметров которого при этом не меняется.
И мне пока непонятно, как эту проблему разруливать.

Добавлено через 23 часа 26 минут
Задействовал черновую версию двоичного дерева. Пока что оно, вместе со всеми своими метафункциями, лежит в папке meta/types/.
Работает оно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
 
#include <meta/types.h>
 
int main ()
{
    typedef meta::create_map
    <
        meta::map_value<5, int>,
        meta::map_value<4, double>,
        meta::map_value<6, int>,
        meta::map_value<3, bool>,
        meta::map_value<2, long>
    >
    ::type map;
    
    typedef meta::insert_value<map, meta::map_value<-100500, std::string>>::type new_map;
    
    typedef meta::at_key<new_map, -100500>::type type;
    type string = "Это строка.";
            
    return 0;
}
Пока что доступны только вставка и доступ по ключу. Надеюсь вскоре завершить удаление и приступить к балансировке (честно говоря, и так уже отлаживать тяжко, а когда в каждом узле появится ещё высота поддерева, родительский узел и т.п., боюсь, крыша совсем уедет).
3
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 01:08
Цитата Сообщение от volovzi Посмотреть сообщение
create_map
почему не назвать просто map ?

Цитата Сообщение от volovzi Посмотреть сообщение
map_value
в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2011, 01:08
Помогаю со студенческими работами здесь

Библиотека QT Linux X11 и библиотека QT Embedded Linux одно ито же???
Вот стал скачивать эти библиотеки и вижу - у них размер одинаковый......да и ссылка одна и та же..... Это одно и тоже ? а в чём прикол???...

Библиотека
Библиотека (в программировании, от англ. library) — сборник подпрограмм или объектов, используемых для разработки программного обеспечения....

Библиотека
В библиотеке есть список книг. Каждая запись этого списка содержит фамилии авторов, название книги, год издания. Определить, в данном...

библиотека GD
Вот входящее изображение : я его копирую, открываю для работы и сохраню. Копируется нормально. вот что с изображением когда сохраняю...

БД Библиотека
Развитие постановки задачи Теперь ситуация изменилась. Несложный анализ показал, что стоимость проката книги должна зависеть не только от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru