Gegeben:größte sizeof Bestimmung() im Boost-Variante
boost::variant<T1,T2,T3,...,TN>
folgenden bei der Kompilierung ermitteln:
max(sizeof(T1), sizeof(T2), sizeof(T3),... ,sizeof(TN))
ich keine Ahnung hatte, wie man diesen Ansatz, aber this Antwort Schuppen auf etwas Licht wie ich anfangen könnte. Verwenden Sie den Code in dieser Antwort mit zwei Typen, T1
und T2
, ich folgend in einer Quelldatei verwenden, könnte die Größe des größeren Objekts zu erhalten:
size_t largestSize = sizeof(largest<T1, T2>::type);
Das ist genau das, was ich tun mag, aber ich brauche die Vorlage largest
, um mit mehr als zwei Klassen zu arbeiten - speziell würde es alle Typen überprüfen müssen, die in einem boost::variant
Objekt gespeichert werden.
Ich weiß, dass boost::variant
eine types
typedef hat, die eine Art Liste von Typen in der Variante definiert. Das Problem ist, ich werde total verloren, wenn ich versuche, meinen Kopf um alle boost::mpl
Sachen in der Implementierung zu wickeln. Ich verstehe nicht intuitiv, was boost::variant::types
ist, und wie ich es in meine eigene Vorlage übergeben könnte, die etwas damit macht.
In meinem Kopf ist es das, was die endgültige Umsetzung aussehen könnte:
typedef boost::variant<T1, T2, T3, T4> MyVariant;
size_t largestSize = sizeof(largest<MyVariant::types>::type);
Leider habe ich keine Ahnung, wie man über die Umsetzung dieser Version von largest
zu gehen.
Ich bin nicht sicher, ob dies ein vernünftiger Ansatz ist, also bin ich offen für alle anderen Möglichkeiten, dies zu erreichen (vielleicht eine boost::static_visitor
auf alle Arten zur Kompilierzeit anwenden?).
ich mit dieser Lösung ging, aber während meiner Prüfung bemerkte ich, dass dies mit GCC nicht 4.8.2 oder Klirren 3.5.0 kompiliert und älter , während Wojciechs Antwort unten mit GCC 4.7.3 und clang 3.0 kompiliert. Ich habe auch festgestellt, dass keine Lösung mit MSVC19 kompiliert. Nichts davon ist im Kontext der Frage wirklich wichtig, aber es könnte nützlich sein, wenn jemand über diese Antwort stolpert. –