将其翻译为中文:将操纵符添加到C++流中特别困难,因为没有对操纵符的使用方式进行控制的能力。可以在流中插入新的语言环境,该语言环境已安装有控制数字输出的特性 - 但不能控制字符串的输出方式。然后问题仍然在于如何将引用状态安全地存储到流中。
字符串使用位于std
命名空间中定义的操作符进行输出。如果要更改这些输出的方式,但仍保持操作符的外观,则可以创建代理类:
namespace quoting {
struct quoting_proxy {
explicit quoting_proxy(std::ostream & os):os(os){}
template<typename Rhs>
friend std::ostream & operator<<(quoting_proxy const& q,
Rhs const& rhs) {
return q.os << rhs;
}
friend std::ostream & operator<<(quoting_proxy const& q,
std::string const& rhs) {
return q.os << " " << rhs << " ";
}
friend std::ostream & operator<<(quoting_proxy const& q,
char const* rhs) {
return q.os << " " << rhs << " ";
}
private:
std::ostream & os;
};
struct quoting_creator { } quote;
quoting_proxy operator<<(std::ostream & os, quoting_creator) {
return quoting_proxy(os);
}
}
int main() {
std::cout << quoting::quote << "hello" << std::endl;
}
哪个适合用于ostream
。如果想要泛化,还可以将其制作为模板,并接受basic_stream
而不是普通的string
。在某些情况下,它具有与标准操作符不同的行为。因为它通过返回代理对象来工作,所以它不适用于像...这样的情况。
std::cout << quoting::quote;
std::cout << "hello";