3

これは、TransformクラスのROS(リンク)のTransform.hからのコードです。

/**@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オブジェクトにキャストし、結果としてそれを返します(2つのタイプは互換性がないように見えるため、これがどのように可能になるかについてはかなりわかりません)。

しかし、返される結果はVector3です...そしてこれが私のメンタルモデルが崩壊する場所です。

さらに、この関数はTransformクラスに基づいてVector3ポイントを変換することになっているので、私の理解は間違いなくどこかに欠陥があります。

洞察をいただければ幸いです。

ありがとう

編集

返信いただきありがとうございます!すぐ上の関数は次のとおりです。

/**@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);
}

私は今、何が起こっているのか理解しています。再度、感謝します。

4

1 に答える 1

7

次に、Vector3 オブジェクトを Transform オブジェクトにキャストし、結果としてそれを返します。

いいえ、キャストは行われません。これ:

return (*this)(x);

次と同等です。

return this->operator()(x);

どちらの場合も、コードはそれを呼び出しTransform::operator()て渡しxます。最初のコードの括弧が必要なのは、コードを括弧で囲んでいない()バインドよりも強力なバインドは、コンパイル エラーと同等になるためです。**thisreturn *(this(x));

ちなみに、これは非常に慣用的な C++ コードですが、構文が C プログラマーを混乱させる可能性があることは理解できます (結局のところ、演算子はもちろん、オーバーロードできませんoperator())。

于 2013-03-15T00:42:01.630 に答える