我正在编写一个名为Double的类,它扩展了c++中内置的'double‘类型。它有一个类型为“double”的数据成员。对于类Double,我需要重载许多基本算术运算符,如"+“、"-”、"*“、"/”。例如,"+“运算符以这种方式重载:
Relation<Double>* operator+ (Double &d2)
// Relation is a abstract class template.
{
/*
...code that do something else.
*/
return new Plus<Double>(this, &d2); // Plus is derived from Relation.
}
// Double + Double returns a Relation pointer.
"-“操作符以同样的方式快速超载:
Relation<Double>* operator- (Double &d2)
{
/*
...code that do something else but the same as above.
*/
return new Minus<Double>(this, &d2);
}
实际计算由关系类中的成员函数完成。操作符体的唯一区别是对象initialized(Plus与减去)。对于带有两个操作数的操作符,我应该总是这样做重载,这是重复的,不太好。因此,模板函数出现在我的脑海中。但问题是,我可以传递+或减号作为模板参数,但不能传递运算符。如何制作模板或使用其他方法来重载这些操作符?
发布于 2018-02-23 15:46:25
是的,操作符重载可能是一个痛苦的源代码重复代码,请参阅这一建议符合标准来缓解它。
现在我唯一能想到的就是这样的事情:
template<typename T>
struct OperatorMinus {
static T doIt(T const& lhs, T const& rhs) { return lhs - rhs; };
}
template<typename T>
struct OperatorPlus {
static T doIt(T const& lhs, T const& rhs) { return lhs + rhs; };
}
template<typename T, typename U>
class Operator: public Relation<T>
public:
Operator(T const& lhs, T const& rhs): _lhs(lhs), _rhs(rhs) {}
T doIt() override {
return U::doIt(_lhs, _rhs);
}
private:
T _lhs;
T _rhs;
};
Relation<Double>* operator+ (Double &d2)
{
return new Operator<Double, OperatorPlus<Double>>(this, &d2);
}
https://stackoverflow.com/questions/48951635
复制相似问题