struct ListItem
{
ListItem* GetPrev () { return nullptr; }
ListItem* GetNext () { return nullptr; }
// ... and many more
};
template <typename T>
struct ListItemT : ListItem
{
T* GetPrev () { return static_cast<T*>(ListItem::GetPrev()); }
T* GetNext () { return static_cast<T*>(ListItem::GetNext()); }
};
struct One : ListItemT<One>
{
};
class Two : public ListItemT<Two>
{
};
class Object : public One, public Two
{
};
int main() {
Object o;
One* prev = o.One::GetPrev();
// your code goes here
return 0;
}
c3RydWN0IExpc3RJdGVtCnsKICAgIExpc3RJdGVtKiAgIEdldFByZXYgICAgICgpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgIExpc3RJdGVtKiAgIEdldE5leHQgICAgICgpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgIC8vIC4uLiBhbmQgbWFueSBtb3JlCn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IExpc3RJdGVtVCA6IExpc3RJdGVtCnsKICAgIFQqICAgIEdldFByZXYgKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KExpc3RJdGVtOjpHZXRQcmV2KCkpOyB9CiAgICBUKiAgICBHZXROZXh0ICgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihMaXN0SXRlbTo6R2V0TmV4dCgpKTsgfQp9OwoKc3RydWN0IE9uZSA6IExpc3RJdGVtVDxPbmU+CnsKfTsKCmNsYXNzIFR3byA6IHB1YmxpYyBMaXN0SXRlbVQ8VHdvPgp7Cn07CgpjbGFzcyBPYmplY3QgOiBwdWJsaWMgT25lLCBwdWJsaWMgVHdvCnsKfTsKCmludCBtYWluKCkgewoJT2JqZWN0IG87CglPbmUqIHByZXYgPSBvLk9uZTo6R2V0UHJldigpOwoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=