重载加法运算符时的代码重复
Code duplication when overloading addition operator
让我们以一个表示间隔的简单类为例。我希望它支持以下操作:
int main()
{
Interval<double> i1(1, 2);
Interval<double> i2(3, 4);
i1 + 1.0;
1.0 + i1;
i1 + 1.0f;
1.0f + i1;
i1 + 1;
1 + i1;
i1 + i2;
}
一个可能的实现是
template<typename Real>
class Interval
{
public:
Interval(Real value)
: lower(value), upper(value)
{ }
template<typename Real2>
Interval(Real2 value)
: lower(value), upper(value)
{ }
template<typename Real2>
Interval(Real2 l, Real2 u)
: lower(l), upper(u)
{ }
Interval<Real>& operator += (Interval<Real> rhs)
{
lower += rhs.lower;
upper += rhs.upper;
return *this;
}
private:
Real lower, upper;
};
template<typename Real>
const Interval<Real> operator + (Interval<Real> i1, const Interval<Real>& i2)
{
i1 += i2;
return i1;
}
template<typename Real1, typename Real2>
const Interval<Real1> operator + (Interval<Real1> i1, const Real2& r2)
{
i1 += r2;
return i1;
}
template<typename Real1, typename Real2>
const Interval<Real2> operator + (const Real1& r1, Interval<Real2> i2)
{
i2 += r1;
return i2;
}
这有一些代码重复。有没有更"经济"的实施方法?什么是最佳实践?
您可以通过在
Interval
中提供一个构造函数来减少重载函数的数量,该构造函数只接受Real
类型的一个参数。
那么,你所需要实现的就是:
template <typename Real>
Interval<Real> operator+(Interval<Real> const& lhs, Interval<Real> const& rhs)
如果有一个成员函数:
Interval operator + (const Interval& i2)
{
Interval<Real> i1 = *this;
i1 += i2;
return i1;
}
,然后,我可以编译:
Interval<double> i1(1, 2);
Interval<double> i2(3, 4);
std::cout << (i1 + i2) << std::endl;
std::cout << (i1 + 1.0) << std::endl;
std::cout << (i1 + 1.0f) << std::endl;
std::cout << (i1 + 1) << std::endl;
但是如果我有一个自由函数:
template<typename Real>
Interval<Real> operator + (Interval<Real> i1, const Interval<Real>& i2)
{
i1 += i2;
return i1;
}
然后,我得到编译器错误:
std::cout << (i1 + 1.0) << std::endl;
std::cout << (i1 + 1.0f) << std::endl;
std::cout << (i1 + 1) << std::endl;
我不知道为什么会这样。
更新2
多亏了@MooingDuck,很清楚为什么自由函数不起作用,而成员函数可以工作。
作为成员函数,没有模板演绎,因此需要转换。作为一个自由函数,有模板扣除,它禁止用户转换。
相关文章:
- 为什么模数运算符不适用于该代码
- 逻辑运算符上出现错误代码 a')'
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- std::string == 运算符在代码中不起作用
- 将 c++ 代码转换为 python,使用运算符?
- 为什么无法覆盖涉及第三方代码的模板类的运算符<<?
- 重载 <= 运算符,但程序以退出代码 -1073741571 (0xC00000FD) 结尾
- 如何翻译这个给定代码中的 ::* 运算符和member_fn?
- 代码块编译错误与运算符<<不匹配
- 为多个签名使用相同的代码重载赋值运算符?
- 赋值运算符在我制作类模板时使代码崩溃
- 在使用具有相等运算符定义的抽象类时,如何定义父类以减少代码重复?
- 删除运算符如何在我的代码中工作
- 在混合 c 和 c++ 代码中使用运算符 new
- 任何机构都可以在运算符重载中解释这行代码
- 没有运算符"[]"匹配这些操作数/没有模板化代码
- 试图重写代码以包括模量运算符
- 重载新运算符 - 此代码不应产生错误
- 此代码运算符超载中的错误是什么?
- 无法在 Visual Studio 2013 中运行非常基本的代码 - 运算符">>"错误/生成错误