274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
1 | |
Библиотека метапрограммирования10.12.2011, 15:08. Показов 6629. Ответов 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
6
|
10.12.2011, 15:08 | |
Ответы с готовыми решениями:
54
Применение метапрограммирования Паттерны метапрограммирования шаблонов Дорожная библиотека + основная библиотека процессов Библиотека QT Linux X11 и библиотека QT Embedded Linux одно ито же??? |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
10.12.2011, 17:23 | 2 |
volovzi, Интересно... Но почему бы не использовать boost вместе? Например meta::select - тот же mpl::if_.
are_equal == boost::is_same.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
10.12.2011, 17:31 [ТС] | 3 |
ForEveR, ждал этого вопроса.
Библиотека вся весит пока что сотню килобайт, поэтому не хочется тащить за ней многомегабайтный "Буст". К тому же мне не нравятся начальные и завершающие подчёркивания в именах . А по поводу "are_equal" — это я забыл убрать. Во-первых, в библиотеке она не используется, а во-вторых, уже есть "std::is_same". Кстати, "select" тоже, вроде, в данный момент не используется...
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
10.12.2011, 17:40 | 4 |
volovzi, Но вообще очень даже интересная либа. Развивайте обязательно. Немного позже попробую ее использовать.
1
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
10.12.2011, 17:45 [ТС] | 5 |
ForEveR, спасибо. К следующей версии допишу исчерпывающие комментарии, допилю итераторы и, может, сделаю какую-нибудь документацию.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
10.12.2011, 22:30 [ТС] | 7 |
niXman, дык там платы, вроде, требуют.
А вообще, да, надо найти, где разместить исходники. Я над этим думаю.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
11.12.2011, 02:31 [ТС] | 9 |
niXman, уже разобрался, скоро сделаю.
Добавлено через 39 минут Ну вот как-то так: https://github.com/izvolov/Meta Добавлено через 35 минут Всё, теперь всё должно быть правильно. Товарищи модераторы, добавьте, пожалуйста, ссылку в первое сообщение темы.
0
|
11.12.2011, 06:05 | 10 |
get_pattern<> - хорошая идея
volovzi, может тему перенести в https://www.cyberforum.ru/cpp-experts/ ?
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
11.12.2011, 15:58 [ТС] | 11 |
niXman, не стоит. Тот раздел закрытый, а мне не хотелось бы ограничивать комментирование в этой теме — тут и так народу немного.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
19.12.2011, 00:37 [ТС] | 12 |
Обновил репозиторий.
Добавлены комментарии, читаемые сообщения об ошибках и немного итераторных метафункций. К сожалению, итераторы навели в библиотеке лёгкий беспорядок — их пришлось запихивать в отдельное пространство имён, и я ещё не решил, как их лучше структурировать: либо создавать в каждом разделе дополнительную папку с итераторными метафункциями, либо выделить все итераторы в отдельный блок, в котором будут свои разделы, либо оставить так, как сейчас — всё в куче. Далее, в продолжение развития темы новой концепции шаблонов ("patterns") появился контейнер шаблонов — "pattern_list<...>", который пригодился как раз в итераторах. И, поскольку изначально всё создавалось для работы с кортежами, написал метафункцию, распаковывающую кортеж и передающую его в функцию или функтор так, как будто это не кортеж, а набор отдельных переменных. Она работает, но мой компилятор, к сожалению, её не тянет, поэтому она не в проекте, а отдельно по ссылке: http://liveworkspace.org/code/... 4a54a4a227
0
|
19.12.2011, 20:00 | 13 | |||||
это как понимать?
Добавлено через 12 часов 53 минуты volovzi, идея такая есть... добавь еще шаблон создания кортежа из произвольного набора индексов типов. типа:
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
19.12.2011, 20:15 [ТС] | 14 |
В настоящий момент не существует ни одного компилятора, полностью поддерживающего новый стандарт. Например, gcc не понимает спецификаторы "override" и "final", а мой — apple llvm — не компилирует вышеуказанную программу. Происходит ошибка внутри компилятора.
0
|
19.12.2011, 20:27 | 15 |
gcc-4.7.0 понимает. тестовые версии для вендус можешь найти у меня в подписи.
релиз выйдет в феврале. Добавлено через 2 минуты а зачем в метапрограммировании могли они понадобиться? оО
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
19.12.2011, 20:40 [ТС] | 16 |
4.7 — будет понимать. В феврале, когда выйдет. А последняя стабильная на данный момент 4.6 — не понимает.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
22.12.2011, 21:48 [ТС] | 17 |
Сообщение было отмечено как решение
Решение
"По заявкам трудящихся" написал метафункцию "subset", позволяющую создавать новый класс из произвольного подмножества типов некоторого класса. К сожалению, по-умному сделать пока что не удалось, поэтому время работы — O(m * n), где n — число типов в исходном шаблоне, а m — размер формируемого подмножества.
Тем не менее, поиски лучшего результата продолжаются. Изменения вступят в силу со следующего коммита. Добавлено через 23 часа 53 минуты Не прошло и дня, как мне удалось сильно продвинуться. Буквально только что написал метакласс, который является полноценным двоичным деревом поиска со всеми его алгоритмическими характеристиками. Правда, пока что нет балансировки (не было времени, спешил сообщить об успехах), но я думаю, что раз есть принципиальная возможность создать дерево, то и отбалансировать его получится. Надеюсь, эта штука поможет усовершенствовать некоторые не очень быстрые алгоритмы.
3
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
23.12.2011, 22:18 [ТС] | 19 | |||||
Сообщение было отмечено как решение
Решение
niXman, собираюсь, конечно!
Но нужно сначала придумать, как это оформить и структурировать. Не сегодня, так завтра обязательно выложу. Добавлено через 22 минуты Тут ведь вот какая проблема возникла: до сих пор библиотека была рассчитана на работу с типами шаблонов, а дерево — реальный контейнер времени компиляции. Поэтому такие метафункции, как, например, "insert", будут иметь совершенно разный смысл. В первом случае это создание новой конкретизации шаблона с новыми типами, а во втором — внесение значения в контейнер, количество шаблонных параметров которого при этом не меняется. И мне пока непонятно, как эту проблему разруливать. Добавлено через 23 часа 26 минут Задействовал черновую версию двоичного дерева. Пока что оно, вместе со всеми своими метафункциями, лежит в папке meta/types/. Работает оно так:
3
|
24.12.2011, 01:08 | 20 |
почему не назвать просто map ?
в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
0
|
24.12.2011, 01:08 | |
24.12.2011, 01:08 | |
Помогаю со студенческими работами здесь
20
Библиотека Библиотека библиотека GD БД Библиотека Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |