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