QString 的运算符<<
Operator << for 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库中,我假设有任何特别的理由不这样做。超载有什么风险/不便<<如上所述?
如果<<
操作符包含在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&)
宏。
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多