1

我正在使用 DirectXMath.h,其中所有乘法和运算都使用 XMVECTOR(一个 SIMD 包装器)完成,并且使用包含 3 个浮点数的 XMFLOAT3 进行存储。但是在这段特定的代码中,我确实需要为 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 回答