Mik*_*ike 7 c++ templates operator-overloading
我必须为我制作的一些非常复杂的对象重载基本的算术运算符.到目前为止,我已成功实施operator*; 现在我需要operator+等等.代码operator*非常大,但是operator*和operator+我之间的唯一区别在于我使用的一行+而不是*一些复杂的数字.这一行将在一个被多次调用的循环内部,所以我希望它有效,这似乎意味着没有函数指针.(如我错了请纠正我.)
这似乎是模板的完美用法.但我对正确的语法感到茫然.我在ComplicatedObject类定义中思考这样的事情:
template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
// Do lots of stuff
for(unsigned int i=0; i<OneBazillion; ++i) {
// Here, the f[i] are std::complex<double>'s:
C.f[i] = ComplexBinaryOp(f[i], B.f[i]);
}
// Do some more stuff
return C;
}
inline ComplicatedObject operator*(const ComplicatedObject& B) const {
return BinaryOp<std::complex::operator*>(B);
}
inline ComplicatedObject operator+(const ComplicatedObject& B) const {
return BinaryOp<std::complex::operator+>(B);
}
Run Code Online (Sandbox Code Playgroud)
这个问题是相关的:"作为模板参数传递的函数".但作为模板参数传递的函数不是运算符.
我已经用我能想到的各种方式摆弄了语法,但编译器总是抱怨语法错误.我该怎么做?
为清楚起见,我在上面的代码中包含了完整的解决方案,以及人们可能需要的其他概括:
template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
// Do lots of stuff
for(unsigned int i=0; i<OneBazillion; ++i) {
// Here, the f[i] are std::complex<double>'s:
C.f[i] = ComplexBinaryOp()(f[i], B.f[i]); // Note extra ()'s
}
// Do some more stuff
return C;
}
inline ComplicatedObject operator+(const ComplicatedObject& B) const {
return BinaryOp<std::plus<std::complex<double> > >(B);
}
inline ComplicatedObject operator-(const ComplicatedObject& B) const {
return BinaryOp<std::minus<std::complex<double> > >(B);
}
inline ComplicatedObject operator*(const ComplicatedObject& B) const {
return BinaryOp<std::multiplies<std::complex<double> > >(B);
}
inline ComplicatedObject operator/(const ComplicatedObject& B) const {
return BinaryOp<std::divides<std::complex<double> > >(B);
}
Run Code Online (Sandbox Code Playgroud)
我认为std::plus<std::complex>和std::multiplies<std::complex>是您正在寻找的,但我不能 100% 确定我理解您的问题(您的代码片段是否在您没有向我们展示的类中?)