Арифметика указателя на «это» указатель

Какое законное и / или интересное использование для выполнения арифметики указателей на указателе this в C ++, если таковой имеется?

Просто для того, чтобы SE порадовался продолжительности этого вопроса, я добавлю соответствующий код.

class Foo
{
public:
Foo(bool terminate = false)
: _data(terminate ? -1 : 0)
{}

void Bar(void)
{
if (_data >= 0)
{
_data++;
this[1].Bar();
}
}

private:
int _data;
};

void main()
{
std::vector<Foo> vec;
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo(true));

vec[2].Bar();
}

0

Решение

Краткий ответ: нет.

Конечно, вы делаете все виды черной магии с этим, например. получить доступ к предыдущим или следующим элементам массива, как вы показали, получить доступ к закрытому члену базового класса через смещение указателя или получить «уникальный» идентификатор объекта из его памяти, если он никогда не перемещается. Но все это может иметь неприятные последствия в какой-то момент, и для всего, что я могу придумать, есть более безопасное решение.

Одно из законных применений, о которых я могу подумать, это проверка выравнивания. Скажи, что у тебя есть float4 класс, который требует 16-байтовое выравнивание, вы можете поместить утверждение в конструктор, который гарантирует, что (((uintptr_t)(const void *)(this)) % 16 == 0).

5

Другие решения

Это законно, но, как говорится в комментариях, это ужасный стиль.

Вы не должны этого делать, кроме случаев, когда вы разработчик инструментария, пишущий тесты на соответствие.

0

По вопросам рекламы [email protected]