A little belatedly, I guess, but here we go:
For you German speakers out there, my first Heise Developer article, “Dem Elfenbeinturm entreißen: Über den praxisrelevanten Einsatz der Template-Metaprogrammierung“, “just” went live on Heise’s site.
It shows how to use TMP to convert from QVariant
to boost::variant<>
. Even if you don’t speak German, you might be interested in the sample source code: ftp://ftp.heise.de/pub/ix/developer/elfenbein.zip.
From the article:
Als Ansatz für eine Konvertierungsfunktion lässt sich Folgendes schreiben.
template <typename T_Variant>
T_Variant qvariant2variant( const QVariant & qv ) {
for( T : types(T_Variant) )
if ( qv.type() == T )
return T_Variant( qvariant_cast<T>( qv ) );
throw bad_cast( "..." );
};
Es fehlen noch zwei Dinge, um aus dem Pseudocode “richtigen” Code zu erstellen: Erstens ein Weg, um einen Typ T
auf den dazugehörigen QVariant-internen Diskriminator abzubilden. Das leistet das Funktions-Template qMetaTypeId()
[…].
Zweitens ein Weg, um “für jeden Typ T
, den T_Variant
enthalten kann”, abzubilden. Das lässt sich mit TMP lösen (Stichwort: Liste von Typen), was die Aufgabe für den Rest des Artikels sein wird.