我必须编写一个通常用作缓冲区的程序。我创建了一个包含AddToBuffer
等方法的类,其中包含char*
,int
,string
的重载,另一个类的实例等。我的任务也是创建一些运算符重载。所以我提出了一个使用+运算符添加到缓冲区的想法,与AddToBuffer
一样。我是否真的必须为所有参数创建重载,或者可以“别名”operator+
到AddToBuffer
。或者我应该将所有AddToBuffer
更改为operator+
?
提前致谢。
答案 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 ++是一种非常危险的语言,它允许你做任何事情,并让你逃脱它。如果你不小心你做了什么,你最终可能会陷入困境中,如果你只是用其他方式写出来的话,那就试着找一些工作得更好的工作。我去过那儿。不要犯同样的错误。