QString 的运算符<<

Operator << for QString

本文关键字:lt 运算符 QString      更新时间:2023-10-16

实现<<对于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库中,我假设有任何特别的理由不这样做。超载有什么风险/不便<<如上所述?

如果<<操作符包含在Qt库中,该库的每个客户端都必须使用完全相同的实现。但是由于QString的性质,这并不是这些客户想要的。一些在西欧编写与遗留文件交互的软件的人可能希望使用Latin1()字符,美国人可能使用Ascii(),而更现代的软件可能希望使用Utf8()。

在库中只有一个实现将会限制整个库的功能

没有必要实现这样的事情,只要存在这样一个方便的解决方案,涉及QTextStream

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

被接受的答案指出了QString没有operator<<函数的一些正当理由。

通过在特定于应用程序的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

我不认为在Qt library中排除(也不包括)这一点有任何特别的理由。这里可能出现的唯一问题是std::ostream对象可能修改传递给std::ostream::operator<<函数的参数的内容。

然而,在参考中明确指出,如果传递字符串缓冲区,则此函数将修改参数-没有关于其他类型的任何信息,因此我猜(常识告诉我)operator<<不会修改char*参数。此外,本页没有任何关于修改传递对象的内容。

最后一件事:代替使用QString::toAscii().constData(),你可以使用QString::toStdString()qPrintable(const QString&)宏。