【发布时间】:2022-01-18 04:33:21
【问题描述】:
我创建了以下类
template<typename T, typename S>
class Polar{
private:
T rad;
S phi;
public:
Polar(T r, S p) : rad{r}, phi{p} {}
template<typename A, typename B>
friend std::ostream& operator<<(std::ostream&, const Polar<A,B>&);
我想覆盖不同数据类型的乘法函数,例如 int 和 double 这样的
int main() {
Polar<int,int> p{2,3};
Polar<int,int> w{4,5};
Polar<float,double> z{6,7};
std::cout << p*w << std::endl;
std::cout << p*z << std::endl;
return 0;
}
我在 Polar 中将函数声明为好友,如下所示:
template<typename A, typename B, typename C, typename D>
friend auto operator*(const Polar<A,B>&, const Polar<C,D>&);
然后实现如下:
template<typename A, typename B, typename C, typename D>
auto operator*(const Polar<A,B>& p, const Polar<C,D>& w) -> Polar<decltype(p.rad * w.rad),decltype(p.phi + w.phi)>
{
return Polar<decltype(p.rad * w.rad),decltype(p.phi + w.phi)> {(p.rad * w.rad),(p.phi + w.phi)};
}
但由于在扣除前使用自动,我得到了一个错误。 我不知道如何让返回类型起作用,我不想为每个可能的组合编写一个函数。
有没有简单的方法来解决这个问题?
【问题讨论】:
-
你有没有问过自己
operator*的返回类型应该是什么? -
它应该返回一个带有乘法结果的新 Polar 类。但是在必要时使用类型转换,例如 int * double 应该返回一个 double 但 int * int 应该只返回 int
-
你试过用
Polar<decltype(A * C),decltype(C + D)>替换auto吗? -
是的,但它只会导致很多错误(token * 之前的预期主表达式)
-
您可能想在此处使用common_type_t,以确定输出类型。
标签: c++ templates operator-overloading