Запутанный (* это) приведение указателя

Это код из Transform.h в ROS (ссылка на сайт) в классе Transform.

/**@brief Return the transform of the vector */
TFSIMD_FORCE_INLINE Vector3 operator*(const Vector3& x) const
{
return (*this)(x);
}

Может кто-нибудь объяснить, что делает этот кусок кода? Вот то, что я думаю (для контекста, у меня есть несколько лет опыта работы программистом на C, впервые разрабатывая на C ++.)

Функция вызывается, когда вызывается следующее

object_of_type_Transform * object_of_type_Vector3

Затем он преобразует объект Vector3 в объект Transform и возвращает его в результате (мне совершенно неясно, как это возможно, поскольку эти два типа не кажутся совместимыми).

Но возвращаемым результатом является Vector3 … и здесь моя ментальная модель рушится.

Кроме того, предполагается, что функция преобразует точку Vector3 на основе класса Transform … так что мое понимание где-то явно ошибочно.

Буду признателен за любые идеи.

Спасибо

РЕДАКТИРОВАТЬ

Спасибо за ответ! Функция справа выше:

/**@brief Return the transform of the vector */
TFSIMD_FORCE_INLINE Vector3 operator()(const Vector3& x) const
{
return Vector3(m_basis[0].dot(x) + m_origin.x(),
m_basis[1].dot(x) + m_origin.y(),
m_basis[2].dot(x) + m_origin.z());
}

/**@brief Return the transform of the vector */
TFSIMD_FORCE_INLINE Vector3 operator*(const Vector3& x) const
{
return (*this)(x);
}

Теперь я понимаю, что происходит. Еще раз спасибо.

3

Решение

Затем он преобразует объект Vector3 в объект Transform и возвращает его в результате.

Нет. Не происходит кастинг; этот:

return (*this)(x);

эквивалентно:

return this->operator()(x);

В обоих случаях код вызывает Transform::operator() и прохождение x к этому. Скобки в первом коде необходимы, потому что () связывает сильнее, чем * так без круглых скобок *this код будет эквивалентен return *(this(x)); — ошибка компиляции.

Между прочим, это довольно идиоматический код C ++, но я вижу, как синтаксис может сбивать с толку программистов C (где, в конце концов, вы не можете перегружать операторы, не говоря уже о operator()).

7

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector