Оператор << для QString

Имеет смысл реализовать < для QString как:

std::ostream&  operator <<(std::ostream &stream,const QString &str)
{
   stream << str.toAscii().constData(); //or: stream << str.toStdString(); //??
   return stream;
}

вместо записи

stream << str.toAscii().constData();

каждый раз в коде.

Однако, поскольку он не находится в стандартной библиотеке Qt, я предполагаю, что есть какая-то особая причина не делать этого. Каковы риски/неудобства перегрузки < < как указано выше?

Ответ 1

Если оператор << включен в библиотеку Qt, каждому клиенту библиотеки придется использовать ту же самую реализацию. Но из-за природы QString это далеко не очевидно, это то, чего хотят эти клиенты. Некоторые люди, пишущие программное обеспечение, взаимодействующие с устаревшим файлом в западной Европе, могут захотеть использовать символы Latin1(), люди из США могут пойти с Ascii(), и более современное программное обеспечение может захотеть использовать Utf8().

Наличие единственной реализации в библиотеке будет неприемлемо ограничивать то, что можно сделать со всей библиотекой.

Ответ 2

Не нужно реализовывать такую ​​вещь, если существует такое удобное решение, как этот, включающий QTextStream

QString s;
QTextStream out(&s);
s << "Text 1";
s << "Text 2";
s << "And so on....";

QTextStream довольно мощный...

Ответ 3

Я не думаю, что есть какая-то особая причина для исключения (и не включая) этого в Qt library. Единственная проблема, которая может возникнуть здесь, - это возможность того, что объект std::ostream может изменить содержимое параметра, переданного функции std::ostream::operator<<.

Однако в reference четко указано, что эта функция изменит параметр, если передан строковый буфер - ничего не говорится о другие типы, поэтому я предполагаю (и здравый смысл говорит мне), что оператор < не будет изменять параметр char*. Кроме того, на странице this нет ничего об изменении переданного объекта.

Последняя вещь: вместо QString::toAscii().constData() вы можете использовать макрос QString::toStdString() или qPrintable(const QString&).

Ответ 4

Принятый ответ указывает на некоторые веские причины, по которым нет функции operator<< для QString.

Можно легко преодолеть эти причины, предоставив некоторые удобные функции и поддерживая некоторое состояние в приложении namespace.

#include <iostream>
#include <QString>

namespace MyApp
{
   typedef char const* (*QStringInsertFunction)(QString const& s);

   char const* use_toAscii(QString const& s)
   {
      return s.toAscii().constData();
   }

   char const* use_toUtf8(QString const& s)
   {
      return s.toUtf8().constData();
   }

   char const* use_toLatin1(QString const& s)
   {
      return s.toLatin1().constData();
   }

   // Default function to use to insert a QString.
   QStringInsertFunction insertFunction = use_toAscii;

   std::ostream& operator<<(std::ostream& out, QStringInsertFunction fun)
   {
      insertFunction = fun;
      return out;
   }

   std::ostream& operator<<(std::ostream& out, QString const& s)
   {
      return out << insertFunction(s);
   }
};

int main()
{
   using namespace MyApp;

   QString testQ("test-string");

   std::cout << use_toAscii << testQ << std::endl;
   std::cout << use_toUtf8 << testQ << std::endl;
   std::cout << use_toLatin1 << testQ << std::endl;

   return 0;
}

Вывод:

test-string
test-string
test-string