背景
我有一个在内部使用 vector<std::string> 的容器类。我为这个包装类提供了一个方法AddChar(std::string) ,它对内部向量执行push_back() 。在我的代码中,有时我必须向容器中添加多个项目。为此我必须使用
container.AddChar("First");
container.AddChar("Second");
这使得代码更大。所以为了让它更容易,我打算重载操作符<<。这样我就可以写了
container << "First" << "Second"
两个项目将被添加到基础向量中。
这是我用来做的代码
class ExtendedVector
{
private:
vector<string> container;
public:
friend ExtendedVector& operator<<(ExtendedVector& cont,const std::string str){
cont.AddChar(str);
return cont;
}
void AddChar(const std::string str)
{
container.push_back(str);
}
string ToString()
{
string output;
vector<string>::iterator it = container.begin();
while(it != container.end())
{
output += *it;
++it;
}
return output;
}
};
它按预期工作。
问题
- 运算符重载是否正确编写?
- 在这种情况下重载运算符是一种好习惯吗?
- 这段代码会有任何性能问题或任何其他问题吗?
有什么想法吗?
编辑
在听到优秀的评论后,我决定不超载 << 因为它在这里没有意义。我删除了运算符重载代码,这是最终代码。
class ExtendedVector
{
private:
vector<string> container;
public:
ExtendedVector& AddChar(const std::string str)
{
container.push_back(str);
return *this;
}
.. other methods
}
这允许我添加
container.AddChar("First").AddChar("Second")
在 C# 中,我可以通过使用 params 关键字更轻松地做到这一点。代码会像
void AddChar(params string[] str)
{
foreach(string s in str)
// add to the underlying collection
}
我知道在 C++ 中,我们可以使用...来指定参数的可变长度。但是 AFAIK,它不是类型安全的。那么这样做是推荐的做法吗?这样我就可以写了
container.AddChar("First","Second")
感谢您的回复。