Können Sie Beispiele aus der Praxis von Boost::MPL teilen (außer lambdas), nur um mir die Zwecke und das praktische Anwendungsgebiet besser verständlich zu machen? Das Tutorial zur MPL-Dokumentation hat ein dimensional analysis Beispiel, aber vielleicht, weil es so ein akademisches Beispiel ist, hat es mir kein Gefühl von Boost :: MPL gegeben und wann es effektiv verwendet werden kann.Beispiele für den praktischen Einsatz von Boost :: MPL?
Antwort
Ich habe Boost.Mpl verwendet, um variantenähnliche Klassen zu generieren.
Um zum Beispiel einer MPL Liste Typen wie dies angegeben:
typedef boost::mpl::set<Foo, Bar, Baz> type_set;
I dann boost::mpl::fold
verwenden, um eine Kette von Klassen von der jeweils anderen abgeleitet zu bauen, die jeweils addiert eine std::unordered_set
von einem des Typs in den Typen einstellen. Das Endergebnis ist eine Klasse, die eine unordered_set<Foo>
, eine unordered_set<Bar>
und eine unordered_set<Baz>
enthält.
Und weil die Klasse in Bezug auf eine boost::mpl::set
angegeben ist, kann ich diese Typen iterieren automatisch auch andere Funktionen zu erzeugen, wie ein operator==
, die alle der unordered_set
s vergleicht.
Ich verwende eine erweiterte dimensional Analyse Bibliothek namens Boost.Units.
Ich habe eine Reflektionsbibliothek zur Kompilierungszeit entwickelt und dann diese Bibliothek verwendet, um eine generische Klasse zu erstellen, die die Laufzeitreflexion zu jedem übergebenen reflektierten Typ der Kompilierungszeit bereitstellt. Ich habe diese Unterstützung verwendet, um UI-Komponenten automatisch zu generieren um die Eigenschaften solcher reflektierter Typen zu bearbeiten.
Es ist auch wichtig für die Verteilung von Ereignissen in unserer Anwendung. Wenn zum Beispiel jemand die Einheiten ändert, in denen das System sein soll, muss ich diesem System nicht beibringen, dass neue Elemente zu bestimmten Geräten hinzugefügt wurden, weil der Code MPL verwendet, um diese Typen zu analysieren, und weiß, dass etwas hinzugefügt wurde und ändert es.
Ich habe gerade metaprogramming Techniken verwendet, um die Qt-Signale in etwas einzuwickeln, das die Typsicherheit zurückgewinnt, die durch ihr System entfernt wird und in der Lage ist, mit irgendeiner Funktionseinheit in Verbindung zu treten.
Aber um die Wahrheit zu sagen, Sie haben fast sicher praktisch angewandte Metaprogrammierung Techniken bereits verwendet, wenn Sie Standard-Algorithmen wie Sortieren verwendet haben. Eine anständige Implementierung des Sortieralgorithmus verwendet eine weniger entwickelte Form der Metaprogrammierung, um die übergebenen Iteratoren zu analysieren, und verwendet dann die Tag-Verteilung, um einen Sortieralgorithmus zu initiieren, der in der Lage ist, die Merkmale dieser Iteratoren vollständig zu nutzen.
Ehrlich gesagt, wenn Sie nicht Metaprogrammierung tun, dann nutzen Sie nicht die Macht von C++ und Sie können auch etwas anderes verwenden.
Tatsache ist, Boost.MPL, wie Boost.Preprocessor, sind wirklich Bausteine.
Meistens verwenden Sie es wahrscheinlich durch andere Bibliotheken, da eine Reihe von Boost-Bibliotheken auf diesen beiden basieren.
Zum Beispiel:
- Boost.Fusion (die die Lücken zwischen Kompilierzeit-kreuzt und Laufzeit-Realms)
- Boost.Multiindex (für eine einfachere Schnittstelle)
- steigern.Einheit (für dimensionale Analyse)
- Boost.Variant kann, glaube ich, hängt auch von ihm
Sie es unknowningly bereits verwenden :)
zu Matthieu Antwort hinzuzufügen, es ist auch sehr intensiv genutzt in beiden Boost.Python und Luabind.
boost.proto, boost.spirit (qi, karma, lex) ... eigentlich in den meisten anderen Boost-Bibliotheken ... –
Etwas komisch ich tat: https://github.com/edubois/static-factorial/blob/master/main.cpp
Es verwendet einen winzigen Teil von boost :: mpl statisch den Wert von Fakultäts < 8>() zu berechnen ...
Dies kann die verstehen helfen Hauptidee.
Ich verwende boost :: mpl (und boost :: fusion) ausgiebig in meiner stat_log Bibliothek. Diese Bibliothek ermöglicht es dem Benutzer, eine Hierarchie von Statistik- und Protokollierungstags und ihre zugeordneten Verhaltensweisen, d. H. Pro-Tag-Statistiktypen (Histogramm, Zähler usw.), anzugeben.
ich verlassen sich stark auf metaprogramming das Richtige mit dem Benutzer zu tun hat:
stat_log::writeStat<IP_PKTS_RCVD>(450);
Zum Beispiel, wenn der Benutzer das Merkmal Typ definiert:
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
>
>;
};
die „writeStat“ oben nennen Proxy (zur Kompilierzeit) zu einer Histogrammstatistik. Der mächtige Aspekt dieser Entwurfstechnik ist, dass die Call-Site "writeStat" überhaupt nicht mit der gewählten bestimmten Statistik gekoppelt ist.
Ich benutze auch eine Fülle von MPL und Boost :: Fusion, um die Statistiken tatsächlich zu sehen. Per Ihre Frage finden Sie in den folgenden Dateien für die höchste Konzentration von boost :: 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
vor allem die raffinierte Vorlage Meta "Funktion" in 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
>;
};
};
Broken Links und Täuschung :( – Quentin
Ich musste die Bibliothek aus Github .... – rmccabe3701
Ich denke, die Frage betrifft Boost.MPL und nicht Metaprogrammierung im Allgemeinen. – jalf
Sie können nicht über MPL ohne all die Sachen sprechen, die dazu führen. –
, aber Sie können fragen, ob Sie Boost.MPL verwenden, ohne zu fragen, ob Sie ein anderes Beispiel für die Metaprogrammierung der Vorlage verwenden, so wie Sie fragen können, ob Sie einen Volvo fahren, ohne zu fragen, ob Sie ein Auto fahren " – jalf