Предположим, у меня есть эта структура:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
Оператор[] должен работать должным образом, потому что vector_data — это тип POD. Ожидаемое поведение заключается в том, что vector_data[0] возвращает x, а vector_data[1] возвращает y.
Теперь предположим, что у меня есть вторая структура:
struct more_data
{
double evil_data;
// There could be more here, data or functions
};
И получить от обоих вот так:
struct composed : public more_data, public vector_data
{
};
Будет ли это разрушать ожидаемое поведение оператора []? Другими словами, будет ли this-указатель vector_data в производной структуре по-прежнему указывать на часть vector_data структуры или он будет указывать на начало производной структуры?
Если он уничтожает operator[], то как я могу решить эту проблему? Я могу сначала наследовать от vector_data, но предположим, что состав содержит виртуальные функции. Я знаю, что большинство компиляторов помещают vtable в конец, но это не гарантируется. Что было бы лучшим подходом?
void*
, что должно работать именно так, как ожидалось (или, скорее, что вы подразумеваете под ожидаемым)? - person Mat   schedule 25.12.2011void*
указателям не определена, внутреннее приведение бесполезно. - person Mat   schedule 25.12.2011static_cast<double*>(static_cast<void*>
почему не простоreinterpret_cast
? - person curiousguy   schedule 26.12.2011