首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Operator overloading+用于添加多个对象

Operator overloading+用于添加多个对象
EN

Stack Overflow用户
提问于 2016-01-10 02:19:07
回答 2查看 2.4K关注 0票数 2

我需要使用操作符重载添加多个对象,如下所示:

代码语言:javascript
复制
ex1 operator+(const ex1 &c1, const ex1 &c2, more++){
    return ex1(c1 + c2 + more++);
}

这个函数添加两个对象,但是我想添加多个对象。这有可能吗?

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2016-01-10 02:23:52

只需定义

代码语言:javascript
复制
ex1 operator+(const ex1 &c1, const ex1 &c2){
    return ex1(c1.inner_value + c2.inner_value);
}

然后

代码语言:javascript
复制
a + b + c

将被解释为

代码语言:javascript
复制
operator+(  operator+(a,b) , c )

所以它应该是可行的

票数 2
EN

Stack Overflow用户

发布于 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包在确定何时创建临时表达式方面做得非常好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34697208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档