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!