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!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage