Фон
У меня есть класс-контейнер, который использует внутри себя 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")
Спасибо за ответы.