Eliminar entradas duplicadas de argumentos de modelo vardic do C ++ 11

Estou usando modelos variadic com herança virtual múltipla em C ++ para agregar tipos em uma única definição de estrutura.

Aqui está um conjunto de amostras de estruturas:

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

Em seguida, agregue-os usando várias heranças virtuais:

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

Eu posso então fazer:

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

Estes podem então cascatear:

typedef zipper<meas3, meas_type> meas_type2;

O objeto resultante, no entanto, é bastante complicado:

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

de acordo com o gdb.

Há também um problema secundário ao tentar zipar o mesmo tipo de base:

typedef zipper<meas, meas> meas_type2;

O acima produz o erro do compilador "classe base duplicada 'meas' é inválida" no G ++ 4.6.3.

A questão é, portanto, dupla:

Existe uma maneira de transformarzipper<meas3, zipper<meas, meas2>> para dentrozipper<meas3, meas2>?Existe uma maneira, ao realizar # 1, para remover entradas duplicadas na lista de tipos?

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion