Оператор << для 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