Это код из 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);
}
Теперь я понимаю, что происходит. Еще раз спасибо.
Затем он преобразует объект Vector3 в объект Transform и возвращает его в результате.
Нет. Не происходит кастинг; этот:
return (*this)(x);
эквивалентно:
return this->operator()(x);
В обоих случаях код вызывает Transform::operator()
и прохождение x
к этому. Скобки в первом коде необходимы, потому что ()
связывает сильнее, чем *
так без круглых скобок *this
код будет эквивалентен return *(this(x));
— ошибка компиляции.
Между прочим, это довольно идиоматический код C ++, но я вижу, как синтаксис может сбивать с толку программистов C (где, в конце концов, вы не можете перегружать операторы, не говоря уже о operator()
).
Других решений пока нет …