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

C++

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

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

10.12.2011, 15:08. Просмотров 5258. Ответов 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
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
19.12.2011, 20:40  [ТС] #16
Цитата Сообщение от niXman Посмотреть сообщение
gcc-4.7.0 понимает. тестовые версии для вендус можешь найти у меня в подписи.
релиз выйдет в феврале.
4.7 — будет понимать. В феврале, когда выйдет. А последняя стабильная на данный момент 4.6 — не понимает.

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

а зачем в метапрограммировании могли они понадобиться? оО
Незачем. Просто пример.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
22.12.2011, 21:48  [ТС] #17
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
"По заявкам трудящихся" написал метафункцию "subset", позволяющую создавать новый класс из произвольного подмножества типов некоторого класса. К сожалению, по-умному сделать пока что не удалось, поэтому время работы — O(m * n), где n — число типов в исходном шаблоне, а m — размер формируемого подмножества.
Тем не менее, поиски лучшего результата продолжаются.
Изменения вступят в силу со следующего коммита.

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

Цитата Сообщение от volovzi Посмотреть сообщение
map_value
в map`ах, как правило, лежат пары. почему бы просто не назвать - pair ?
0
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 ?
А, нет, это ты меня запутал. Под парой подразумевается пара типов. А я пока не делаю обобщений, у меня строго "число-тип". Поэтому если сделать пару, то придётся писать обёртку над числом, так что удобства от этого нисколько не прибавится.
0
niXman
Эксперт С++
3137 / 1449 / 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 позволяет в качестве ключа использовать только целые. какой смысл? %)
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 02:19  [ТС] #23
Цитата Сообщение от niXman Посмотреть сообщение
в boost.mpl так и сделано. и я не сказал бы что не удобно.. или просто привычка)
Ну вот мне было бы неудобно. К тому же не люблю бустовские классы с подчёркиваниями в начале и в конце.

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

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

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

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

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

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

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

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

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

зачем на больше-меньше? только на равенство.
Хм, да, не подумал. Но не будет ли тогда слишком много балансировок при вставке? Надо посчитать.
0
niXman
Эксперт С++
3137 / 1449 / 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, в общем думай... с тестами могу подсобить, если в мемберы добавишь
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
24.12.2011, 13:46  [ТС] #27
Цитата Сообщение от niXman Посмотреть сообщение
понятно. тогда это не map. или не тот map, который сразу приходит в голову видя такое имя
Сейчас подумал ещё раз — равенства однозначно недостаточно. Во-первых, в этом случае речь не идёт об упорядоченности: порядок элементов в карте будет зависеть от порядка добавления их в неё. Во-вторых, если применять балансировку к такой карте, то в ней будет невозможно найти элемент по ключу, а если не применять, то карта вырождается в список.
Так что либо как-то назначать типам числовые идентификаторы, либо оставлять пока что только целочисленные ключи.

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

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

Добавлено через 20 часов 15 минут
я в общем-то плохо с git знаком. но то что нагуглил, не позволило ничего закоммитить.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2011, 10:56
Привет! Вот еще темы с ответами:

Как узнать, что поток закончился (библиотека 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?


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
25.12.2011, 10:56
Ответ Создать тему
Опции темы

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