Форум программистов, компьютерный форум 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++ Динамическая Библиотека
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 01:31  [ТС]     Библиотека метапрограммирования #21
Цитата Сообщение от niXman Посмотреть сообщение
почему не назвать просто map ?
Особенность реализации. Загляни в исходники.
Я над этим думаю. Наверное, в конце концов так и сделаю. Когда пойму, как.

в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
Да, спасибо — это я тупо забыл переделать .

Кстати, вот ещё одна идея родилась: сделать метафункции для работы с деревом "методами" этого дерева.
То есть синтаксис будет такой:
C++
1
2
    typedef map::insert<17, std::string> new_map;
    typedef new_map::at<17> type;
Новый стандарт позволяет это делать.

P.S. Если есть ещё какие-нибудь замечания, буду рад выслушать.

Добавлено через 8 минут
Цитата Сообщение от niXman Посмотреть сообщение
в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
А, нет, это ты меня запутал. Под парой подразумевается пара типов. А я пока не делаю обобщений, у меня строго "число-тип". Поэтому если сделать пару, то придётся писать обёртку над числом, так что удобства от этого нисколько не прибавится.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 02:10     Библиотека метапрограммирования #22
Цитата Сообщение от volovzi Посмотреть сообщение
придётся писать обёртку над числом
в boost.mpl так и сделано. и я не сказал бы что не удобно.. или просто привычка)

Добавлено через 3 минуты
я вот еще о чем подумал... не плохо бы для всего этого дела наваять тесты и экзамплы

Добавлено через 1 минуту
Цитата Сообщение от volovzi Посмотреть сообщение
map::insert<17, std::string> new_map;
new_map::at<17> type;
тут ">::type" не пропустил? или такая задумка?

Добавлено через 3 минуты
минутку.. я так понял, что твой map позволяет в качестве ключа использовать только целые. какой смысл? %)
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 02:19  [ТС]     Библиотека метапрограммирования #23
Цитата Сообщение от niXman Посмотреть сообщение
в boost.mpl так и сделано. и я не сказал бы что не удобно.. или просто привычка)
Ну вот мне было бы неудобно. К тому же не люблю бустовские классы с подчёркиваниями в начале и в конце.

я вот еще о чем подумал... не плохо бы для всего этого дела наваять тесты и экзамплы
Ну, я к каждому коммиту переписываю main. А писать полноценные тесты и нормальную документацию — это ты слишком многого от меня хочешь . Разве что на новогодних каникулах сподоблюсь.

тут ">::type" не пропустил? или такая задумка?
Задумка. Максимально избавиться от лишнего. Обдумываю как вариант.

минутку.. я так понял, что твой map позволяет в качестве ключа использовать только целые. какой смысл? %)
Ну, во-первых, потому что опять же была такая задумка. Во-вторых, вся библиотека построена на целых. Обёрток к тривиальным типам не делал. А в-третьих, я не очень понимаю, как можно сравнивать на больше-меньше классы. Сопоставлять им какие-то числа?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 08:48     Библиотека метапрограммирования #24
Цитата Сообщение от volovzi Посмотреть сообщение
бустовские классы с подчёркиваниями в начале
с подчёркиваниями в начале, что-то не припомню таких, публичных...

Цитата Сообщение от volovzi Посмотреть сообщение
А писать полноценные тесты и нормальную документацию
мне думается, что если писать тесты+экзамплы для каждого шаблона, то на доку можно забить. тут не плохо было бы добавить файлик со списком шаблонов и их хидеров, и в этом файлике напротив каждого шаблона можно было бы отмечать статус конкретного шаблона: релиз/есть_тесты/есть_дока/есть_экзамплы/итд..
конечно, я понимаю что писать экзамплы+доку+тесты когда уже либа написана и в ней куча шаблонов - грустно. по этому и предлагаю это делать для каждого шаблона еще на стадии его программирования. к тому же, это упростит написание и тестирование самого шаблона. но это имхо, конечно. и хозяин - барин, естественно.

Цитата Сообщение от volovzi Посмотреть сообщение
ты слишком многого от меня хочешь
это всего лишь предложение.

Цитата Сообщение от volovzi Посмотреть сообщение
вся библиотека построена на целых
когда целые используются в качестве индексов при обращении с последовательностями - это нормально. и совсем другое дело, когда map превращается не в карту ключ->значение. но это так же имхо, разумеется.

Цитата Сообщение от volovzi Посмотреть сообщение
я не очень понимаю, как можно сравнивать на больше-меньше классы
зачем на больше-меньше? только на равенство.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 12:58  [ТС]     Библиотека метапрограммирования #25
Цитата Сообщение от niXman Посмотреть сообщение
мне думается, что если писать тесты+экзамплы для каждого шаблона, то на доку можно забить. тут не плохо было бы добавить файлик со списком шаблонов и их хидеров, и в этом файлике напротив каждого шаблона можно было бы отмечать статус конкретного шаблона: релиз/есть_тесты/есть_дока/есть_экзамплы/итд..
А в каком виде ты предлагаешь делать тесты?

конечно, я понимаю что писать экзамплы+доку+тесты когда уже либа написана и в ней куча шаблонов - грустно. по этому и предлагаю это делать для каждого шаблона еще на стадии его программирования. к тому же, это упростит написание и тестирование самого шаблона. но это имхо, конечно.
Ну, примеры и тесты, возможно, стоит делать сразу. Просто надо подумать, как это лучше организовать. Есть конструктивные предложения?
А с документацией — как раз наоборот. Поскольку библиотека ещё только на ранней стадии, в ней может многое поменяться. И потом будет накладно исправлять, помимо самого кода, ещё и документацию.

когда целые используются в качестве индексов при обращении с последовательностями - это нормально. и совсем другое дело, когда map превращается не в карту ключ->значение.
Изначально эту карту я рассматривал не как самостоятельный модуль, а как вспомогательный класс для использования в алгоритмах. Например, она позволила бы ускорить компиляцию той же произвольной подпоследовательности ("subset") при больших значениях N и M. А поскольку там всё построено на числовых индексах, то и карту я делал исходя из потребностей этих метафункций.

зачем на больше-меньше? только на равенство.
Хм, да, не подумал. Но не будет ли тогда слишком много балансировок при вставке? Надо посчитать.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 13:15     Библиотека метапрограммирования #26
Цитата Сообщение от volovzi Посмотреть сообщение
в каком виде ты предлагаешь делать тесты?
ну гм.. как обычно) для каждого шаблона по исходнику тестов его корректности результата. создать Makefile который все эти тесты будет собирать+выполнять+выводить результат.

Цитата Сообщение от volovzi Посмотреть сообщение
Есть конструктивные предложения?
как обычно.. создаешь каталог tests. в нем для каждого шаблона по подкаталогу. в этом подкаталоге файлы: 1)исходник теста(или несколько), 2)текстовик с ожидаемым результатом.

Цитата Сообщение от volovzi Посмотреть сообщение
Изначально эту карту я рассматривал не как самостоятельный модуль, а как вспомогательный класс для использования в алгоритмах.
понятно. тогда это не map. или не тот map, который сразу приходит в голову видя такое имя

Цитата Сообщение от volovzi Посмотреть сообщение
Но не будет ли тогда слишком много балансировок при вставке?
-
Цитата Сообщение от volovzi Посмотреть сообщение
Надо посчитать.


Добавлено через 42 секунды
volovzi, в общем думай... с тестами могу подсобить, если в мемберы добавишь
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 13:46  [ТС]     Библиотека метапрограммирования #27
Цитата Сообщение от niXman Посмотреть сообщение
понятно. тогда это не map. или не тот map, который сразу приходит в голову видя такое имя
Сейчас подумал ещё раз — равенства однозначно недостаточно. Во-первых, в этом случае речь не идёт об упорядоченности: порядок элементов в карте будет зависеть от порядка добавления их в неё. Во-вторых, если применять балансировку к такой карте, то в ней будет невозможно найти элемент по ключу, а если не применять, то карта вырождается в список.
Так что либо как-то назначать типам числовые идентификаторы, либо оставлять пока что только целочисленные ключи.

ну гм.. как обычно) для каждого шаблона по исходнику тестов его корректности результата. создать Makefile который все эти тесты будет собирать+выполнять+выводить результат.

как обычно.. создаешь каталог tests. в нем для каждого шаблона по подкаталогу. в этом подкаталоге файлы: 1)исходник теста(или несколько), 2)текстовик с ожидаемым результатом.
volovzi, в общем думай... с тестами могу подсобить, если в мемберы добавишь
Было бы здорово. С удовольствием добавлю. Только как? Я не нашёл, где это делается.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 14:15     Библиотека метапрограммирования #28
Цитата Сообщение от volovzi Посмотреть сообщение
Только как? Я не нашёл, где это делается.
я тоже)
нужно погуглить по этому поводу...
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 14:31  [ТС]     Библиотека метапрограммирования #29
niXman, а разве публичный репозиторий не все могут редактировать? Вроде, для этого ничего специально делать не нужно.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 10:56     Библиотека метапрограммирования #30
Цитата Сообщение от volovzi Посмотреть сообщение
разве публичный репозиторий не все могут редактировать?
а хз) никогда не пытался редактировать чей-то репозиторий)
сейчас попробую.

Добавлено через 20 часов 15 минут
я в общем-то плохо с git знаком. но то что нагуглил, не позволило ничего закоммитить.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
25.12.2011, 12:59  [ТС]     Библиотека метапрограммирования #31
niXman, а почему не получилось? Что говорят?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 13:10     Библиотека метапрограммирования #32
volovzi, однозначно ответить затрудняюсь потому, что гуглил примеры работы с git. потом пытался их использовать. но так ничего и не получилось %)
возможно, либо примеры были не правильные, либо я что-то не так делал, либо для коммита нужно иметь права.

Добавлено через 31 секунду
приведи ты свои команды. только без паролей, если они есть.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
25.12.2011, 13:20  [ТС]     Библиотека метапрограммирования #33
Как-то так:
Код
git clone git@github.com:izvolov/Meta.git

# Произведены какие-то изменения.

cd Meta
git commit -a -m "Проба."
git push origin master
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 13:51     Библиотека метапрограммирования #34
сделал в точности как ты показал, за исключением url`а.

вывод:
nixman@nixman-pc:~/Meta$ git push origin master
fatal: remote error:
You can't push to git://github.com/izvolov/Meta.git
Use git@github.com:izvolov/Meta.git
он мне рекомендует использовать урл вида: git@github.com:izvolov/Meta.git
но при попытке его использовать, получаю:
nixman@nixman-pc:~$ git clone git@github.com:izvolov/Meta.git
Cloning into Meta...
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
выводы?
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
25.12.2011, 14:56  [ТС]     Библиотека метапрограммирования #35
niXman, а, всё-таки надо сначала ответвиться, а потом уже делать запрос на присоединение к основной ветке.
А графические приложения не пробовал? У тебя какая система?

Добавлено через 18 минут
Вот здесь ещё неплохо написано:
http://habrahabr.ru/blogs/Git/125799/#comment_4147240
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 15:25     Библиотека метапрограммирования #36
Цитата Сообщение от volovzi Посмотреть сообщение
А графические приложения не пробовал?
пробовал. но понятнее не стало. просто нужно заставить себя, и прочесть вводный курс хоть раз

Цитата Сообщение от volovzi Посмотреть сообщение
У тебя какая система?
линукс.

Цитата Сообщение от volovzi Посмотреть сообщение
Вот здесь ещё неплохо написано:
http://habrahabr.ru/blogs/Git/125799/#comment_4147240
ушел читать.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
28.12.2011, 21:05  [ТС]     Библиотека метапрограммирования #37
Ну чё?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.12.2011, 01:48     Библиотека метапрограммирования #38
volovzi, насколько я понял, нужно зайти в админку репы и добавить niXman'а в collaborators.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
31.12.2011, 13:43  [ТС]     Библиотека метапрограммирования #39
CyBOSSeR, я сначала тоже так думал, но увидел справа словосочетание "Private Collaborators" и решил, что это тоже какая-то платная штука, как и закрытые репозитории.
Добавил Никсмана. Но, насколько я понимаю, он в отъезде, поэтому не отвечает.

Добавлено через 11 часов 27 минут
Ура! Незамутнённый утренний пост(и пред-)праздничный разум творит чудеса.
Наконец-то сделал удаление значения по ключу. Пожалуй, это самая сложная на данный момент метафункция в библиотеке.
Страшно представить, что будет в балансировке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2012, 14:24     Библиотека метапрограммирования
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.01.2012, 14:24  [ТС]     Библиотека метапрограммирования #40
С радостью сообщаю, что создание двоичного дерева поиска времени компиляции завершено. Получившаяся структура данных — полноценное дерево АВЛ с соответствующими алгоритмическими характеристиками.

Балансировку оказалось сделать легче, чем я ожидал, в частности, выяснилось, что за высотами ветвей не обязательно следить вручную — узлы могут определять свою высоту автоматически.

Далее последуют усовершенствования, реструктуризации и оптимизации, но то, что оно уже работает — факт.

В репозитории пока нет, но скоро будет.
Yandex
Объявления
03.01.2012, 14:24     Библиотека метапрограммирования
Ответ Создать тему
Опции темы

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