在c ++中使用函数作为运算符重载

时间:2014-03-09 11:18:05

标签: c++ operators operator-overloading overloading

我必须编写一个通常用作缓冲区的程序。我创建了一个包含AddToBuffer等方法的类,其中包含char*intstring的重载,另一个类的实例等。我的任务也是创建一些运算符重载。所以我提出了一个使用+运算符添加到缓冲区的想法,与AddToBuffer一样。我是否真的必须为所有参数创建重载,或者可以“别名”operator+AddToBuffer。或者我应该将所有AddToBuffer更改为operator+

提前致谢。

3 个答案:

答案 0 :(得分:3)

我希望你能做一个类似的模板:

   class someclass
   {
     ...
     template<typename T>
     someclass operator+(T a)
     {
         return AddToBuffer(a); 
     }
     ...
   }

由于您没有准确解释AddToBuffer的工作原理,因此很难准确说出要调用的内容等等

答案 1 :(得分:2)

您可以使用功能模板http://en.cppreference.com/w/cpp/language/function_template。 像这样:

#include <iostream>
#include <string>

class MyBuffer
{
public:
  void AddToBuffer (const std::string& str) {
  }

  void AddToBuffer (const char* str) {
  }

  void AddToBuffer (int i) {
  }

  template<typename T>
  MyBuffer& operator+= (const T& str) {
    this->AddToBuffer (str);
    return (*this);
  }
};

int main (int argc, char *argv[])
{
  MyBuffer buffer;

  buffer += std::string("abcd");
  buffer += "abcd";
  buffer += 1;

  return(0);
}

答案 2 :(得分:0)

由于其他人已经回答了这个问题(我认为),我只想补充几行个人经验:

使用运算符重载很酷。使用模板类很酷。使用多态性是很酷的。但是,冷却器不会使您的代码更好;也不短。有一个原因,你有string.operator +但不是queue.operator +。操作员仅适用于与操作员有关的事情。将内容添加到缓冲区不是其中之一。我给你举个例子。比较一下:

Stack b;
int i;
while ((i = --b) > 0)
    b--;
b += i * 2;

到此:

Stack b;
int i;
while ((i = b.Peek()) > 0)
    b.Pop();
b.Push(i * 2);

看到区别?当然,覆盖一些操作符并编写无人无法读取的代码会更酷,但代码(至少是有用的代码)并不是很酷。它意味着工作,可重用,可读等等.C ++是一种非常危险的语言,它允许你做任何事情,并让你逃脱它。如果你不小心你做了什么,你最终可能会陷入困境中,如果你只是用其他方式写出来的话,那就试着找一些工作得更好的工作。我去过那儿。不要犯同样的错误。