Это код из 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
user2172081 15 Мар 2013 в 04:39
Нет актерского состава. 0/10 плохой тролль.
 – 
ta.speot.is
15 Мар 2013 в 04:41

1 ответ

Лучший ответ

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

Нет. Актерский состав не проводится; это:

return (*this)(x);

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

return this->operator()(x);

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

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

7
Konrad Rudolph 15 Мар 2013 в 04:42
Огромное спасибо. Вселенная снова наводит порядок!
 – 
user2172081
15 Мар 2013 в 05:06