Wyeliminuj zduplikowane wpisy z argumentów szablonów zmiennych C ++ 11

Używam szablonów z wieloma zmiennymi dziedziczenia wirtualnego w C ++ do typów agregujących w definicji pojedynczej struktury.

Oto przykładowy zestaw struktur:

struct meas { int i; };
struct meas2 : public virtual meas { int j; };
struct meas3 : public virtual meas { int k; };

Następnie agreguję je za pomocą wielokrotnego dziedziczenia wirtualnego:

template <typename... Args>
struct zipper : public virtual Args... {};

Mogę wtedy:

typedef zipper<meas, meas2> meas_type;
meas* m = new meas_type;

Mogą one następnie kaskadowo:

typedef zipper<meas3, meas_type> meas_type2;

Powstały obiekt jest jednak dość nieporęczny:

$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>}

według gdb.

Istnieje również dodatkowy problem przy próbie zip tego samego typu bazy:

typedef zipper<meas, meas> meas_type2;

Powyższe powoduje błąd kompilatora „duplikat klasy podstawowej„ meas ”jest nieprawidłowy” w G ++ 4.6.3.

Pytanie jest więc dwojakie:

Czy istnieje sposób na transformacjęzipper<meas3, zipper<meas, meas2>> wzipper<meas3, meas2>?Czy istnieje sposób, podczas wykonywania # 1, na usuwanie duplikatów wpisów z listy typów?

Dzięki!

questionAnswers(1)

yourAnswerToTheQuestion