Entfernen Sie doppelte Einträge aus C ++ 11-Vorlagenargumenten
Ich verwende verschiedene Vorlagen mit mehreren virtuellen Vererbungen in C ++, um Typen in einer einzigen Strukturdefinition zusammenzufassen.
Hier ist ein Beispielsatz von Strukturen:
struct meas { int i; };
struct meas2 : public virtual meas { int j; };
struct meas3 : public virtual meas { int k; };
Ich aggregiere diese dann unter Verwendung mehrerer virtueller Vererbung:
template <typename... Args>
struct zipper : public virtual Args... {};
Ich kann dann tun:
typedef zipper<meas, meas2> meas_type;
meas* m = new meas_type;
Diese können dann kaskadieren:
typedef zipper<meas3, meas_type> meas_type2;
Das resultierende Objekt ist jedoch ziemlich unhandlich:
$46 = (zipper<meas3, zipper<meas, meas2> >) {
<meas3> = {
<meas> = {
i = 0
},
members of meas3:
_vptr.meas3 = 0x400ec8,
k = 0
},
<zipper<meas, meas2>> = {
<meas2> = {
members of meas2:
_vptr.meas2 = 0x400ee0,
j = 6299120
},
members of zipper<meas, meas2>:
_vptr.zipper = 0x400eb0
}, <No data fields>}
laut gdb.
Es gibt auch ein sekundäres Problem, wenn versucht wird, denselben Basistyp zu komprimieren:
typedef zipper<meas, meas> meas_type2;
Oben wird der Compilerfehler "Die doppelte Basisklasse 'meas' ist ungültig" unter G ++ 4.6.3 erzeugt.
Die Frage ist also zweifach:
Gibt es einen Weg, sich zu verwandeln?zipper<meas3, zipper<meas, meas2>>
inzipper<meas3, meas2>
?Gibt es eine Möglichkeit, doppelte Einträge in der Typenliste zu entfernen, während # 1 ausgeführt wird?Vielen Dank!