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

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

10.12.2011, 15:08. Показов 7496. Ответов 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
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 01:31  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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 ?
А, нет, это ты меня запутал. Под парой подразумевается пара типов. А я пока не делаю обобщений, у меня строго "число-тип". Поэтому если сделать пару, то придётся писать обёртку над числом, так что удобства от этого нисколько не прибавится.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 02:10
Цитата Сообщение от volovzi Посмотреть сообщение
придётся писать обёртку над числом
в boost.mpl так и сделано. и я не сказал бы что не удобно.. или просто привычка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

как обычно.. создаешь каталог tests. в нем для каждого шаблона по подкаталогу. в этом подкаталоге файлы: 1)исходник теста(или несколько), 2)текстовик с ожидаемым результатом.
volovzi, в общем думай... с тестами могу подсобить, если в мемберы добавишь
Было бы здорово. С удовольствием добавлю. Только как? Я не нашёл, где это делается.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 14:15
Цитата Сообщение от volovzi Посмотреть сообщение
Только как? Я не нашёл, где это делается.
я тоже)
нужно погуглить по этому поводу...
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 14:31  [ТС]
niXman, а разве публичный репозиторий не все могут редактировать? Вроде, для этого ничего специально делать не нужно.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 10:56
Цитата Сообщение от volovzi Посмотреть сообщение
разве публичный репозиторий не все могут редактировать?
а хз) никогда не пытался редактировать чей-то репозиторий)
сейчас попробую.

Добавлено через 20 часов 15 минут
я в общем-то плохо с git знаком. но то что нагуглил, не позволило ничего закоммитить.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
25.12.2011, 12:59  [ТС]
niXman, а почему не получилось? Что говорят?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 13:10
volovzi, однозначно ответить затрудняюсь потому, что гуглил примеры работы с git. потом пытался их использовать. но так ничего и не получилось %)
возможно, либо примеры были не правильные, либо я что-то не так делал, либо для коммита нужно иметь права.

Добавлено через 31 секунду
приведи ты свои команды. только без паролей, если они есть.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
25.12.2011, 13:20  [ТС]
Как-то так:
Code
1
2
3
4
5
6
7
git clone git@github.com:izvolov/Meta.git
 
# Произведены какие-то изменения.
 
cd Meta
git commit -a -m "Проба."
git push origin master
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.12.2011, 13:51
сделал в точности как ты показал, за исключением 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
выводы?
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
25.12.2011, 14:56  [ТС]
niXman, а, всё-таки надо сначала ответвиться, а потом уже делать запрос на присоединение к основной ветке.
А графические приложения не пробовал? У тебя какая система?

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

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

Цитата Сообщение от volovzi Посмотреть сообщение
Вот здесь ещё неплохо написано:
http://habrahabr.ru/blogs/Git/... nt_4147240
ушел читать.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
28.12.2011, 21:05  [ТС]
Ну чё?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
30.12.2011, 01:48
volovzi, насколько я понял, нужно зайти в админку репы и добавить niXman'а в collaborators.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
31.12.2011, 13:43  [ТС]
CyBOSSeR, я сначала тоже так думал, но увидел справа словосочетание "Private Collaborators" и решил, что это тоже какая-то платная штука, как и закрытые репозитории.
Добавил Никсмана. Но, насколько я понимаю, он в отъезде, поэтому не отвечает.

Добавлено через 11 часов 27 минут
Ура! Незамутнённый утренний пост(и пред-)праздничный разум творит чудеса.
Наконец-то сделал удаление значения по ключу. Пожалуй, это самая сложная на данный момент метафункция в библиотеке.
Страшно представить, что будет в балансировке.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
03.01.2012, 14:24  [ТС]
С радостью сообщаю, что создание двоичного дерева поиска времени компиляции завершено. Получившаяся структура данных — полноценное дерево АВЛ с соответствующими алгоритмическими характеристиками.

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

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

В репозитории пока нет, но скоро будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.01.2012, 14:24
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru