C++中运算符重载同时传递附加参数

C++中运算符重载同时传递附加参数,c++,C++,试图将参数传递到重载方法中, NumericSet*运算符+arma::Mat obj1,整数选项 这是可能的,如果是,那么函数调用是什么样子的 例如,我该如何扭转这种局面 NumericSet<T> add(arma::Mat<T> mat, int option) { if (option == 1) { arma::Mat<T> sum = this->data + mat; return

试图将参数传递到重载方法中, NumericSet*运算符+arma::Mat obj1,整数选项 这是可能的,如果是,那么函数调用是什么样子的

例如,我该如何扭转这种局面

NumericSet<T> add(arma::Mat<T> mat, int option) 
{ 
    if (option == 1) 
    { 
        arma::Mat<T> sum = this->data + mat; 
        return new NumericSet<T>(sum); 
    } 
    else 
    { 
        this->data = this->data + mat; 
        return this; 
    } 
} 
变成一个合适的操作符+

谢谢

从以下方面来看:


现在,您可以在使用option=1时使用+,在使用其他选项值时使用+=。

这是不可能的。您不能将额外的参数传递给normal+运算符,在这方面,您的重载运算符的工作方式与normal运算符一样;要么是内存泄漏,要么是应该返回新对象时发生的原地变异,要么是使用全局状态,要么是返回指向无效内存的指针。运算符+也应为非成员仅+=应为成员。你应该读一读,我会查出来的谢谢@某个程序员,这看起来很像一个答案。你能不能把它放在回答部分,这样就可以把它从未回答部分删除?谢谢。@jaidepseth:添加到user4581301,假设遵循0、3或5的规则,当它返回一个全新的对象时,按值返回应该是便宜的;使用RVO/NRVO,任何优化编译器通常都应该能够将构造移动到调用方中,或完全删除构造,因此按值返回与返回指向新内存的指针一样有效,并避免了分配器开销。注意:如果运算符+采用异构参数,则可能需要在两个方向上重载它,因此,您可以执行mat+numset,并使其行为与numset+mat等效。
NumericSet<T> add(arma::Mat<T> mat, int option) {
    if (option == 1) {
        arma::Mat<T> sum = this->data + mat;
        return new NumericSet<T>(sum);
    } else {
        this->data = this->data + mat;
        return this;
    }
}
template<typename T>
class NumericSet {
    ...
    NumericSet<T>& operator+=(const arma::Mat<T>& mat) {
        // Changed from this->data = this->data + mat
        // As a rule, += is always cheaper than +, so as long as data
        // is solely owned by this, mutating in place is likely to be much more efficient
        this->data += mat;
        return *this;
    }
}
template<typename T>
inline NumericSet<T> operator+(NumericSet<T> lhs, const arma::Mat<T>& rhs)
{
  lhs += rhs;
  return lhs;
}