我正在使用 DirectXMath.h,其中所有乘法和运算都使用 XMVECTOR(一个 SIMD 包装器)完成,并且使用包含 3 个浮点数的 XMFLOAT3 进行存储。但是在这段特定的代码中,我确实需要为 XMFLOAT3 添加一个* 运算符(对于XMFLOAT3*XMFLOAT3 和 XMFLOAT3*float)。我可以这样做吗?或者我必须篡改 SDK 中的 DirectXMath 标头吗?
问问题
1356 次
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 回答