Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.74
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 15:08     Библиотека метапрограммирования #1
Увлекшись метапрограммированием, начатым в предыдущей теме, я решил написать небольшую библиотеку метафункций.

Изначально всё это предназначалось для работы с кортежами, но на самом деле оно применимо к любым шаблонным классам. В том числе возможна совместная работа с библиотекой "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 Кб, 47 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2011, 15:08     Библиотека метапрограммирования
Посмотрите здесь:

Библиотека C++
C++ библиотека C++
Библиотека. C++
Библиотека С++ C++
C++ Библиотека Си++
Библиотека C++
Visual C++ Динамическая Библиотека
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
10.12.2011, 17:23     Библиотека метапрограммирования #2
volovzi, Интересно... Но почему бы не использовать boost вместе? Например meta::select - тот же mpl::if_.
are_equal == boost::is_same.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 17:31  [ТС]     Библиотека метапрограммирования #3
ForEveR, ждал этого вопроса.
Библиотека вся весит пока что сотню килобайт, поэтому не хочется тащить за ней многомегабайтный "Буст". К тому же мне не нравятся начальные и завершающие подчёркивания в именах .
А по поводу "are_equal" — это я забыл убрать. Во-первых, в библиотеке она не используется, а во-вторых, уже есть "std::is_same".

Кстати, "select" тоже, вроде, в данный момент не используется...
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
10.12.2011, 17:40     Библиотека метапрограммирования #4
volovzi, Но вообще очень даже интересная либа. Развивайте обязательно. Немного позже попробую ее использовать.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 17:45  [ТС]     Библиотека метапрограммирования #5
ForEveR, спасибо. К следующей версии допишу исчерпывающие комментарии, допилю итераторы и, может, сделаю какую-нибудь документацию.
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.12.2011, 21:42     Библиотека метапрограммирования #6
volovzi, залей исходники на как-нибудь github, что ли.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.12.2011, 22:30  [ТС]     Библиотека метапрограммирования #7
niXman, дык там платы, вроде, требуют.
А вообще, да, надо найти, где разместить исходники. Я над этим думаю.
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.12.2011, 01:16     Библиотека метапрограммирования #8
там есть и free аккаунты. или на гуглкод посмотри.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.12.2011, 02:31  [ТС]     Библиотека метапрограммирования #9
niXman, уже разобрался, скоро сделаю.

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

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

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

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

И, поскольку изначально всё создавалось для работы с кортежами, написал метафункцию, распаковывающую кортеж и передающую его в функцию или функтор так, как будто это не кортеж, а набор отдельных переменных. Она работает, но мой компилятор, к сожалению, её не тянет, поэтому она не в проекте, а отдельно по ссылке: http://liveworkspace.org/code/8843c8...e2714a54a4a227
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.12.2011, 20:00     Библиотека метапрограммирования #13
Цитата Сообщение от 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>
было бы весьма юзабильно в алгоритмах.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
19.12.2011, 20:15  [ТС]     Библиотека метапрограммирования #14
Цитата Сообщение от 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>
было бы весьма юзабильно в алгоритмах.
Интересная задачка. "В лоб" делается легко, а вот чтобы было эффективно — надо подумать.
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.12.2011, 20:27     Библиотека метапрограммирования #15
Цитата Сообщение от volovzi Посмотреть сообщение
gcc не понимает спецификаторы "override" и "final"
gcc-4.7.0 понимает. тестовые версии для вендус можешь найти у меня в подписи.
релиз выйдет в феврале.

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

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

а зачем в метапрограммировании могли они понадобиться? оО
Незачем. Просто пример.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
22.12.2011, 21:48  [ТС]     Библиотека метапрограммирования #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
"По заявкам трудящихся" написал метафункцию "subset", позволяющую создавать новый класс из произвольного подмножества типов некоторого класса. К сожалению, по-умному сделать пока что не удалось, поэтому время работы — O(m * n), где n — число типов в исходном шаблоне, а m — размер формируемого подмножества.
Тем не менее, поиски лучшего результата продолжаются.
Изменения вступят в силу со следующего коммита.

Добавлено через 23 часа 53 минуты
Не прошло и дня, как мне удалось сильно продвинуться.
Буквально только что написал метакласс, который является полноценным двоичным деревом поиска со всеми его алгоритмическими характеристиками. Правда, пока что нет балансировки (не было времени, спешил сообщить об успехах), но я думаю, что раз есть принципиальная возможность создать дерево, то и отбалансировать его получится.
Надеюсь, эта штука поможет усовершенствовать некоторые не очень быстрые алгоритмы.
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
22.12.2011, 22:25     Библиотека метапрограммирования #18
а заливать на гитхаб не собираешься?
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
23.12.2011, 22:18  [ТС]     Библиотека метапрограммирования #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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;
}
Пока что доступны только вставка и доступ по ключу. Надеюсь вскоре завершить удаление и приступить к балансировке (честно говоря, и так уже отлаживать тяжко, а когда в каждом узле появится ещё высота поддерева, родительский узел и т.п., боюсь, крыша совсем уедет).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2011, 01:08     Библиотека метапрограммирования
Еще ссылки по теме:

не подключается библиотека C++
Библиотека C++
C++ Паттерны метапрограммирования шаблонов
библиотека C++
C++ Применение метапрограммирования

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

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 01:08     Библиотека метапрограммирования #20
Цитата Сообщение от volovzi Посмотреть сообщение
create_map
почему не назвать просто map ?

Цитата Сообщение от volovzi Посмотреть сообщение
map_value
в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
Yandex
Объявления
24.12.2011, 01:08     Библиотека метапрограммирования
Ответ Создать тему
Опции темы

Текущее время: 05:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru