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

C++

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

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

10.12.2011, 15:08. Просмотров 5299. Ответов 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
Вложения
Тип файла: zip meta.zip (46.7 Кб, 47 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2011, 15:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Библиотека метапрограммирования (C++):

Графическая библиотека - C++
Здравствуйте! Я недавно задумался о создании своей графической библиотеки на C++. Можете описать мне функцию для вывода квадрата на экран...

Нужна библиотека Windows.h - C++
Очень нужна библиотека Windows.h ввиде файлов с расширением .h Обратитесь к документации для вызываемой функции Windows. Определите...

Работа с твиттер (нужна библиотека) - C++
Уважаемые программисты! Подскажите пожалуйста какой(ими) библиотеками вы пользуетесь для работы с twitter. Хочу создать бота, который бы...

Библиотека Data Access Object - C++
Подскажите, где можно найти информацию про библиотеку Data Access Object для С++, или примеры создания баз данных с использованием этой...

GUI-программирование. Какая библиотека лучше? - C++
Здравствуйте! Я знаю "консольный" C++, теперь хочется освоить какую-нибудь библиотеку или технологию визуального программирования....

Подскажите как работает эта библиотека? - C++
Не могу понять как работает эта библиотека. Посмотрите я вложил архив саму библиотеку и тест программу. Объясните пожалуйста какова функция...

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

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

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

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

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

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

И, поскольку изначально всё создавалось для работы с кортежами, написал метафункцию, распаковывающую кортеж и передающую его в функцию или функтор так, как будто это не кортеж, а набор отдельных переменных. Она работает, но мой компилятор, к сожалению, её не тянет, поэтому она не в проекте, а отдельно по ссылке: http://liveworkspace.org/code/8843c8742cffbc4bc6e2714a54a4a227
0
niXman
Эксперт С++
3138 / 1450 / 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>
было бы весьма юзабильно в алгоритмах.
0
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>
было бы весьма юзабильно в алгоритмах.
Интересная задачка. "В лоб" делается легко, а вот чтобы было эффективно — надо подумать.
0
niXman
Эксперт С++
3138 / 1450 / 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"
а зачем в метапрограммировании могли они понадобиться? оО
0
19.12.2011, 20:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 20:27
Привет! Вот еще темы с ответами:

Как узнать, что поток закончился (библиотека pthread)? - C++
Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает- да, созданный ранее поток Y закончился? ...

Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) - C++
Да, как? #include &lt;windows.h&gt; #include &lt;pthread.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void *BusyWork(void *t) { ...

Библиотека IP*WORKS - C++ Builder
Добрые люди, подскажите, где можно скачать (разумеется бесплатно) библиотеку IP*WORKS для С++.

Библиотека web - C++ Builder
Здравствуйте, подскажите, есть ли какая-нибудь библиотека для работы с web типа synapse?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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