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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.74
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
#1

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

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

Библиотека C++
C++ библиотека C++
Библиотека. C++
Библиотека С++ C++
C++ Библиотека Си++
Библиотека C++
Visual C++ Динамическая Библиотека
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.01.2012, 15:05     Библиотека метапрограммирования #41
volovzi, сорри. запраздновался.
завтра возвращаюсь в работу. проверю - отпишусь.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.01.2012, 19:10  [ТС]     Библиотека метапрограммирования #42
niXman, я так и понял .

Я тут пока привёл нововведения в приличный вид и залил в репозиторий. Сами деревья лежат в meta/types/(multi-)map.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.01.2012, 22:20  [ТС]     Библиотека метапрограммирования #43
Провёл небольшой косметический ремонт того, что уже есть на данный момент.
Из-за того, что я всё-таки решил пойти по пути универсальности деревьев (теперь ключ — тоже тип, но обязательно какой-нибудь числовой), в ближайших планах — реализация арифметических операций со всякими метатипами (целыми, рациональными числами и т.д.).
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.02.2012, 18:50     Библиотека метапрограммирования #44
volovzi, привет.
убери меня из member`ов. вроде разобрался с gitю хочу попробовать сделать комит не будучи member`ом.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.02.2012, 00:15  [ТС]     Библиотека метапрограммирования #45
niXman, сделано.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.02.2012, 00:39     Библиотека метапрограммирования #46
о!
https://github.com/izvolov/Meta/pulls

прими его. я в него добавил два файла.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.02.2012, 00:51  [ТС]     Библиотека метапрограммирования #47
Ура, работает.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.02.2012, 00:56     Библиотека метапрограммирования #48
хе-хе
все, проще некуда.

я постепенно буду тесты пописывать. по возможности.

у тебя есть еще планы по доработке/развитию либы?
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.02.2012, 01:03  [ТС]     Библиотека метапрограммирования #49
niXman, отлично. Я тогда посмотрю на твои тесты и буду параллельно писать по аналогии. Можно будет распределить метафункции, чтоб одно и то же не делать.
Ближайшие планы пока те же: арифметика со всякими метатипами. А есть какие-нибудь предложения?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.02.2012, 01:12     Библиотека метапрограммирования #50
Цитата Сообщение от volovzi Посмотреть сообщение
Можно будет распределить метафункции, чтоб одно и то же не делать.
давай так: в директории tests создаем поддиректорию с именем тестируемого шаблона. (tests/at, к примеру) в ней, файл main.cpp в котором и будет реализован сам тест. тот кто создал директорию - тот и пишет этот тест.
что скажешь?

чтоб не тащить в тесты boost.test, я закожу инфрастуктуру тестов в tests/common/tests.hpp. согласуем за и против, и тогда начнем писать тесты.
мысли?


Цитата Сообщение от volovzi Посмотреть сообщение
А есть какие-нибудь предложения?
сейчас, на сколько я помню, нет контейнера последовательностей, типа mpl::vector<> ?
и алгоритмов недостает.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.02.2012, 01:26  [ТС]     Библиотека метапрограммирования #51
Цитата Сообщение от niXman Посмотреть сообщение
давай так: в директории tests создаем поддиректорию с именем тестируемого шаблона. (tests/at, к примеру) в ней, файл main.cpp в котором и будет реализован сам тест. тот кто создал директорию - тот и пишет этот тест.
что скажешь?
А зачем тесту целая директория? Там будет что-то ещё храниться, кроме непосредственно теста? Исполняемый файл?

чтоб не тащить в тесты boost.test, я закожу инфрастуктуру тестов в tests/common/tests.hpp. согласуем за и против, и тогда начнем писать тесты.
мысли?
Я пока не понимаю, что ты подразумеваешь под инфраструктурой, поэтому начинай, а там видно будет . Единственно что смущает — в библиотеке уже есть раздел "common". Может возникнуть двусмысленность.

сейчас, на сколько я помню, нет контейнера последовательностей, типа mpl::vector<> ?
и алгоритмов недостает.
Ну, есть "type_list". "vector", по идее, подразумевает свободный доступ, а я сомневаюсь, что в рамках действующей модели его вообще возможно реализовать.
А насчёт алгоритмов — согласен. Часть из них как раз будет в арифметике.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.02.2012, 01:40     Библиотека метапрограммирования #52
Цитата Сообщение от volovzi Посмотреть сообщение
А зачем тесту целая директория?
эм.. там может быть текстовый файл который будет сравниваться с выводом теста, при необходимости. ну и на будущее, чтоб потом не разгребать.

Цитата Сообщение от volovzi Посмотреть сообщение
смущает — в библиотеке уже есть раздел "common".
так он в реализации библиотеки. а этот в реализации тестов.

Цитата Сообщение от volovzi Посмотреть сообщение
"vector", по идее, подразумевает свободный доступ, а я сомневаюсь, что в рамках действующей модели его вообще возможно реализовать.
об этом можно подумать потом..
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.02.2012, 19:39  [ТС]     Библиотека метапрограммирования #53
Цитата Сообщение от niXman Посмотреть сообщение
эм.. там может быть текстовый файл который будет сравниваться с выводом теста, при необходимости. ну и на будущее, чтоб потом не разгребать.
Понял, согласен.

так он в реализации библиотеки. а этот в реализации тестов.
Хорошо, давай попробуем.

об этом можно подумать потом..
Если придумаешь, это будет покруче дерева поиска .

Добавлено через 17 часов 50 минут
Внёс в проект кое-что из арифметики и сравнения.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
29.02.2012, 21:42  [ТС]     Библиотека метапрограммирования #54
Внёс ещё кое-какие улучшения в деревья, начал заниматься десятичными дробями (непростая штука, как оказалось).

Появилась идея насчёт тестов: поскольку вся библиотека — это алгоритмы и структуры данных времени компиляции, то, мне кажется, идеологически верно было бы и тесты делать в рамках этой концепции. То есть без необходимости их запускать: если скомпилировался, то тест пройден успешно, если нет — тест был провален.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2012, 23:42     Библиотека метапрограммирования
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.05.2012, 23:42  [ТС]     Библиотека метапрограммирования #55
На днях выяснил, что std::get<N>(tuple) работает за константное время. Так что метамассив, оказывается, вполне можно реализовать. Осталось только понять, как разработчики СБШ этого добились.

Добавлено через 2 часа 26 минут
Ха-ха! Не всё так просто. Доступ-то константный, а вот построение такого контейнера — квадратичное! И раз это находится в стандарте, то я делаю вывод, что эффективнее не получится. Жаль.
Yandex
Объявления
16.05.2012, 23:42     Библиотека метапрограммирования
Ответ Создать тему
Опции темы

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