Antecedentessobrecarga de operadores << - C++
Tengo una clase de contenedor que utiliza vectores < std :: string > internamente. He proporcionado un método AddChar (std :: string) a esta clase contenedora que hace un push_back() en el vector interno. En mi código, tengo que agregar varios elementos al contenedor en algún momento. Para eso tengo que usar
container.AddChar("First");
container.AddChar("Second");
Esto hace que el código sea más grande. Entonces, para hacerlo más fácil, planeo sobrecargar al operador < <. Para que pueda escribir
container << "First" << "Second"
y dos elementos se agregarán al vector subyacente.
Este es el código que utilicé para que
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;
}
};
Está funcionando como se esperaba.
Preguntas
- es la sobrecarga del operador escriben de forma correcta?
- ¿Es una buena práctica sobrecargar a los operadores en situaciones como esta?
- ¿Habrá algún problema de rendimiento o algún otro problema con este código?
¿Alguna idea?
Editar
Después de escuchar las excelentes comentarios, decidí no sobrecargar < < ya que no tiene sentido aquí. Eliminé el código de sobrecarga del operador y aquí está el código final.
class ExtendedVector
{
private:
vector<string> container;
public:
ExtendedVector& AddChar(const std::string str)
{
container.push_back(str);
return *this;
}
.. other methods
}
Esto me permite agregar
container.AddChar("First").AddChar("Second")
En C#, yo puedo hacer esto más fácilmente mediante el uso de la palabra clave params. Código será como
void AddChar(params string[] str)
{
foreach(string s in str)
// add to the underlying collection
}
Sé que en C++, podemos utilizar ... para especificar langth variable de parámetros. Pero AFAIK, no es seguro. Entonces, ¿es una práctica recomendada hacerlo? Para que pueda escribir
container.AddChar("First","Second")
Gracias por las respuestas.
Qt usa el operador << para QStringList: http://doc.trolltech.com/4.4/qstringlist.html, y me ha gustado su uso con ese. pero en general, me gustaría no agregar demasiados operadores. como dice Kevin, puede ser confuso como el infierno :) –