我需要使用操作符重载添加多个对象,如下所示:
ex1 operator+(const ex1 &c1, const ex1 &c2, more++){
return ex1(c1 + c2 + more++);
}这个函数添加两个对象,但是我想添加多个对象。这有可能吗?
int main(){
// first for example I want to add 3 objects
ex1 ob1, ob2, ob3;
ob1 + ob2 + ob3;
code..
code..
// and after that I want to add for example 10 or more objects
ex1 ob1, ob2, ob3,..., ob10;
ob1 + ob2 + ob3 +....+ ob10;
}发布于 2016-01-10 02:23:52
只需定义
ex1 operator+(const ex1 &c1, const ex1 &c2){
return ex1(c1.inner_value + c2.inner_value);
}然后
a + b + c将被解释为
operator+( operator+(a,b) , c )所以它应该是可行的
发布于 2016-01-10 03:33:29
除了一个例外,C++只有一元运算符和二元运算符。一个例外是三元运算符,以x = condition ? 0 : 42;为例。关于operator+,即一元运算符(例如,+42)或二元运算符(40+2)。
您可以轻松地创建一个自定义函数,该函数接受三个ex1对象作为输入,并以某种方式计算这三个对象的总和。但是,您不能调用此函数operator+。在C++中,接受三个参数的operator+是没有位置的。
有许多方法可以绕过这一限制。最简单的方法是创建一个二进制operator+重载,该重载计算一对ex1对象的和,并创建一个新的ex1对象作为输出。语句ex1 d=a+b+c;将导致对ex1 operator+(const ex1&, const ex1&)的两次调用。两者都将创建一个ex1类型的临时对象。然后将表示a+b+c值的临时值传递给ex1::operator=,以便将该表达式的值赋给d。
如果您一遍又一遍地这样做,这些临时对象的创建很可能会成为性能瓶颈。如果您只这样做了几次,那么性能瓶颈就不是问题。你唯一需要担心的是这是否是一个问题,而确定这是否是你需要解决的问题。
克服这种性能瓶颈的一种方法是创建一个函数(或多个函数),该函数接受两个以上的对象作为输入,并从这些多个对象中创建一个和。缺点是不能将此函数命名为operator+,因此不能使用d=a+b+c。取而代之的是你必须使用像ex1::add_three(ex1&d, const ex1&a, const ex1&b, const ex1&c)这样的东西。
另一种方法是使用expression templates作为实现lazy evaluation的一种方法。您的operator+(const ex1& a, constex1& b)实际上并不计算a+b。相反,它会创建一个最终将计算a+b的对象。表达式a+b+c反过来创建另一个对象,该对象最终将计算该结果。最后,表达式d=a+b+c计算该表达式并将其赋值给d,并且(如果实现正确)不会创建任何临时。
这种方法也有它的缺点。有时创建一个临时的。与使用延迟计算的表达式模板相比,Eigen包在确定何时创建临时表达式方面做得非常好。
https://stackoverflow.com/questions/34697208
复制相似问题