1

私は、すべての乗算と演算がXMVECTOR (SIMD ラッパー) で行われる DirectXMath.h を使用しています。ストレージには、3 つの float を含む XMFLOAT3 が使用されます。XMFLOAT3*XMFLOAT3 と XMFLOAT3*float の両方) できますか?それとも、SDK の DirectXMath ヘッダーを改ざんする必要がありますか?

4

4 に答える 4

4

はい、オーバーロードを定義できますが、メンバー関数としてではなく、フリー関数としてのみ定義できます。

したがって、次のようなことを行うことができます(これがあなたが興味を持っている過負荷であると仮定して):

XMFLOAT3 operator*(XMFLOAT3 a, XMFLOAT3 b) {
    // whatever
}
于 2013-01-09T01:13:20.680 に答える
3

もちろん、C ++では、次のように、演算子のオーバーロードをフリー関数として提供できます。

XMFLOAT3 operator*(XMFLOAT3 left, XMFLOAT3 right)
{
    ...
}

これがパフォーマンスに敏感なコードで使用される場合は、値渡しと定数渡しの参照によって、出力されるコード/パフォーマンスに違いが生じるかどうかを確認してください。

于 2013-01-09T01:14:54.423 に答える
3
XMFLOAT3 operator*(const XMFLOAT3& a, const XMFLOAT3& b){
    XMFLOAT3 ans; 
    ...
    return ans;
}

これは回答のコピーを返し、2 つのオペランドのいずれも変更しないことに注意してください。これは、*演算子のセマンティクスに当てはまります。

于 2013-01-09T01:15:34.733 に答える
2

次のように定義してoperator*ください:

XMFLOAT3 operator*(XMFLOAT3 l, XMFLOAT3 r) {
    XMVECTOR lvec(XMLoadFloat3(&l));
    XMVECTOR rvec(XMLoadFloat3(&r));
    //Perform operations
}

XMFLOAT3 operator*(XMFLOAT3 l, float r) {
    XMVECTOR lvec(XMLoadFloat3(&l));
    //Perform operations
}

XMFLOAT3 operator*(float l, XMFLOAT3 r) {
    XMVECTOR rvec(XMLoadFloat3(&r));
    //Perform operations
}
于 2013-01-09T01:15:24.113 に答える