Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/31: Рейтинг темы: голосов - 31, средняя оценка - 4.61
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
1

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

10.12.2011, 15:08. Просмотров 6049. Ответов 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 Кб, 48 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2011, 15:08
Ответы с готовыми решениями:

Применение метапрограммирования
Доброго времени суток форумчане. Собственно говоря, как часто применимо метапрограммирование в...

Паттерны метапрограммирования шаблонов
Нигде не могу найти литературу по паттернам метапрограммирования шаблонов, александреску не...

Дорожная библиотека + основная библиотека процессов
Доброго времени! Пытаюсь совместить в одной модели дорожную библиотеку и библиотеку моделирования...

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

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

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

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

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

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

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

И, поскольку изначально всё создавалось для работы с кортежами, написал метафункцию, распаковывающую кортеж и передающую его в функцию или функтор так, как будто это не кортеж, а набор отдельных переменных. Она работает, но мой компилятор, к сожалению, её не тянет, поэтому она не в проекте, а отдельно по ссылке: http://liveworkspace.org/code/... 4a54a4a227
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 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
268 / 170 / 11
Регистрация: 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
Эксперт С++
3210 / 1459 / 73
Регистрация: 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
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
19.12.2011, 20:40  [ТС] 16
Цитата Сообщение от niXman Посмотреть сообщение
gcc-4.7.0 понимает. тестовые версии для вендус можешь найти у меня в подписи.
релиз выйдет в феврале.
4.7 — будет понимать. В феврале, когда выйдет. А последняя стабильная на данный момент 4.6 — не понимает.

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

а зачем в метапрограммировании могли они понадобиться? оО
Незачем. Просто пример.
0
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
22.12.2011, 21:48  [ТС] 17
Лучший ответ Сообщение было отмечено как решение

Решение

"По заявкам трудящихся" написал метафункцию "subset", позволяющую создавать новый класс из произвольного подмножества типов некоторого класса. К сожалению, по-умному сделать пока что не удалось, поэтому время работы — O(m * n), где n — число типов в исходном шаблоне, а m — размер формируемого подмножества.
Тем не менее, поиски лучшего результата продолжаются.
Изменения вступят в силу со следующего коммита.

Добавлено через 23 часа 53 минуты
Не прошло и дня, как мне удалось сильно продвинуться.
Буквально только что написал метакласс, который является полноценным двоичным деревом поиска со всеми его алгоритмическими характеристиками. Правда, пока что нет балансировки (не было времени, спешил сообщить об успехах), но я думаю, что раз есть принципиальная возможность создать дерево, то и отбалансировать его получится.
Надеюсь, эта штука поможет усовершенствовать некоторые не очень быстрые алгоритмы.
3
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
22.12.2011, 22:25 18
а заливать на гитхаб не собираешься?
0
268 / 170 / 11
Регистрация: 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;
}
Пока что доступны только вставка и доступ по ключу. Надеюсь вскоре завершить удаление и приступить к балансировке (честно говоря, и так уже отлаживать тяжко, а когда в каждом узле появится ещё высота поддерева, родительский узел и т.п., боюсь, крыша совсем уедет).
3
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.12.2011, 01:08 20
Цитата Сообщение от volovzi Посмотреть сообщение
create_map
почему не назвать просто map ?

Цитата Сообщение от volovzi Посмотреть сообщение
map_value
в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2011, 01:08

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

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

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

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

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


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

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

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