gpt4 book ai didi

c++ - 不为带有模板的用户定义运算符调用隐式构造函数

转载 作者:行者123 更新时间:2023-11-30 01:15:56 25 4
gpt4 key购买 nike

在我的代码中,我实现了一个 Vector3 模板,如下所示:

template <typename T>
struct TVector3{
TVector3(const T& x, const T& y, const T& z); // normal constructor from x,y,z
TVector3(const T& val); // construct from a constant value
// .. other implementation
T x, y, z;
};
// and my overload operator+ for TVector3
template <typename T>
const TVector3<T> operator+(const TVector3<T>& lhs, const TVector3<T>& rhs)
{
return TVector3<T>(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z);
}

我期待这样的调用:(1, 2, 3) + 1 = (2, 3, 4),所以我这样写:

TVector3<float> v(1, 2, 3);
v + 1.0f; // error, on operator "+" matches ... operand types are: TVector3<float> + float

然后我似乎明白模板推导应该完全匹配参数类型而不是转换它们,那么我有什么办法告诉编译器将T转换为TVector3吗?我不想像下面这样写 2 个重载,因为代码会变大:

template <typename T>
const TVector3<T> operator+(const TVector3<T>& lhs, const T& rhs);
template <typename T>
const TVector3<T> operator+(const T& rhs, const TVector3<T>& rhs);

感谢您的帮助!

最佳答案

这里的技巧是在实例化类模板时实例化一个实际上不是成员的函数。这可以通过 friend 定义(内联 friend )来完成。当类模板被实例化时, friend 也被实例化,并且也作为非模板函数注入(inject)到周围的命名空间(以受限的方式),以便应用转换。 (我还使返回非常量,因为我不认为你有意这样做。)有关更多详细信息,请查找“ friend 姓名注入(inject)”、“参数相关查找”和相关的 Barton-Nackman 技巧。

template <typename T>
struct TVector3{
friend TVector3<T> operator+(const TVector3<T>& lhs, const TVector3<T>& rhs) {
return TVector3<T>(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z);
}
TVector3(const T& x, const T& y, const T& z); // normal constructor from x,y,z
TVector3(const T& val); // construct from a constant value
// .. other implementation
T x, y, z;
};

int
main() {

TVector3<float> v(1, 2, 3);
v + 1.0f; // Works.
}

需要注意的重要且相关的事情是模板函数和非模板函数之间存在差异,即使签名在其他方面相同

template <typename T> class A;

void f(A<int>); // 1

template <typename T>
void f(A<T>); // 2

template <typename T>
class A {
friend void f(A<T>); // Makes 1 a friend if T == int, but not 2.
friend void f<>(A<T>); /// Makes 2 also a friend.
};

关于c++ - 不为带有模板的用户定义运算符调用隐式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27613843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com