Можете ли вы поделиться с реальными примерами использования Boost::MPL (кроме лямбда), чтобы я мог лучше понять его цели и область практического использования? Учебник по документации MPL имеет пример dimensional analysis, но, возможно, потому, что это такой академический пример, он не дал мне чувство Boost :: MPL и когда он может быть эффективно использован.Примеры практического использования Boost :: MPL?
ответ
Я использовал Boost.Mpl для создания вариантов-подобных классов.
Например, дан список типов MPL, такие как это:
typedef boost::mpl::set<Foo, Bar, Baz> type_set;
Затем я использую boost::mpl::fold
, чтобы построить цепочку из классов, производных от друг друга которых каждый добавляет std::unordered_set
одного из типов в типе задавать. Конечным результатом является класс, который содержит unordered_set<Foo>
, unordered_set<Bar>
и unordered_set<Baz>
.
И потому, что класс определяется в терминах boost::mpl::set
, я могу перебирать эти типы автоматически генерировать другие функции, а также, такие как operator==
, который сравнивает все unordered_set
с.
Я использую более расширенную библиотеку анализа размеров, называемую Boost.Units.
Я разработал библиотеку отражения времени компиляции, а затем использовал эту библиотеку для создания универсального класса, который обеспечивает отражение во время выполнения любого переданного во времени периода компиляции. Я использовал эту поддержку для автоматического создания компонентов пользовательского интерфейса для редактирования свойств таких отраженных типов.
Это также имеет первостепенное значение для распределения событий в нашем приложении. Например, когда кто-то изменяет единицы, которые они хотят, чтобы система находилась в этом состоянии, мне не нужно учить эту систему, что новые элементы были добавлены к указанным устройствам, потому что код использует MPL для анализа этих типов и просто знает, что что-то было добавлено и меняет его.
Я только что использовал методы метапрограммирования, чтобы обернуть сигналы Qt во что-то, что восстановит безопасность типа, удаленную их системой, и сможет подключаться к любому функциональному объекту.
Но, честно говоря, вы почти наверняка использовали практически применяемые методы метапрограммирования уже, когда вы использовали стандартные алгоритмы вроде сортировки. Достойная реализация алгоритма сортировки использует менее развитую форму метапрограммирования для анализа прошедших итераторов, а затем использует диспетчеризацию меток, чтобы инициировать алгоритм сортировки, способный полностью использовать функции этих итераторов.
Честно говоря, если вы не выполняете метапрограммирование, вы не используете силу C++, и вы можете использовать что-то еще.
Дело в том, Boost.MPL, как Boost.Preprocessor, действительно являются строительными блоками.
В большинстве случаев вы, вероятно, используете его в других библиотеках, так как на этих двух языках построено несколько библиотек Boost.
Например:
- Boost.Fusion (который пересекает промежутки между временем компиляции и время выполнением царств)
- Boost.MultiIndex (для более легкого интерфейса)
- Boost.Единица (для анализа размерностей)
- Boost.Variant может, я думаю, также зависит от него
Вы можете использовать его unknowningly уже :)
Чтобы добавить ответ Матье, он также используется довольно широко на всех Boost.Python и Luabind.
boost.proto, boost.spirit (qi, karma, lex) ... фактически в большинстве других библиотек boost ... –
Что смешного я сделал: https://github.com/edubois/static-factorial/blob/master/main.cpp
Он использует крошечную часть повышающего :: MPL статически вычислить значение факториала < 8>() ...
Это может помочь понять Главная идея.
Я использую boost :: mpl (и boost :: fusion) широко в своей библиотеке stat_log. Эта библиотека позволяет пользователю указывать иерархию статистических и протоколирующих тегов и связанных с ними типов поведения, то есть статистических типов для каждого тега (гистограмма, счетчик и т. Д.).
я сильно полагаться на метапрограммировании, чтобы сделать правильную вещь с пользователем делает:
stat_log::writeStat<IP_PKTS_RCVD>(450);
Например, если пользователь определяет тип признак:
template <>
struct stat_tag_to_type<IP_PKTS_RCVD>
{
using type = Accumulator<
stat_log::HistogramCount<
int,
1, //start bin
1500, //stop bin
10 //num_bits
>
>;
};
«writeStat» вызов выше будет прокси (во время компиляции) к статистике гистограммы. Мощным аспектом этой технологии проектирования является то, что сайт вызова «writeStat» совсем не связан с выбранной выбранной статистикой.
Я также использую богатство MPL и boost :: fusion, чтобы фактически просмотреть статистику. По Вашему вопросу см следующие файлы для самой высокой концентрации повышающего :: MPL:
https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/stat_log_impl.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/tag_commander.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/stat_log.h
особенно отличный шаблон мета "функции" в stat_log_impl.h:
//This template is used in conjunction with an MPL algorithm
// with the same semantics as mpl::find_if.
//BoolFunc is the "condition" metafunction.
//StatTagFunc is a metafunction that transforms the given
// stat_tag into something the algorithm requires.
// For example the "Identity" metafunction would work here.
//StatTagArgs is extra arguments to the BoolFunc
template <template<typename...> class BoolFunc,
template<typename...> class StatTagFunc,
class... StatTagArgs>
struct tag_node_query
{
template<typename TheTagNode>
struct apply
{
using stat_tag = typename TheTagNode::tag;
using type = std::integral_constant
<
bool,
BoolFunc<
typename StatTagFunc<stat_tag>::type,
StatTagArgs...
>::value
>;
};
};
Сломанные ссылки и обман :( – Quentin
Мне пришлось взять библиотеку с github .... – rmccabe3701
Я думаю, что речь идет о Boost.MPL, а не метапрограммировании вообще. – jalf
Вы не можете говорить о MPL без всякого материала, который ведет к нему. –
, но вы можете спросить «используете ли вы Boost.MPL», не спрашивая «используете ли вы какой-либо другой пример метапрограммирования шаблонов», так же, как вы можете спросить «вы водите Volvo», не спрашивая: «Вы водите машину « – jalf