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!