我想拦截运营商<<在命名空间内,在打印出来之前为基本类型添加一些额外的格式。可以这样做吗?
namespace Foo {
std::ostream& operator<<(std::ostream& os, bool b) {
//Can I call std::operator<< here now. Something like:
// os std::<< (b ? 10 : -10) << std::endl;
}
}
谢谢!
答案 0 :(得分:1)
你可以使用显式函数调用语法来完成它。对于您的情况,调用应为os.operator<<(b ? 10 : -10)
,因为the corresponding operator<<
是成员函数。
但是,使用operator<<
,您将无法再在名称空间Foo中使用std::cout << true
等表达式,因为这会触发Foo::operator<<(std::ostream&, bool)
和{{1}之间的歧义成员函数std::ostream
:都接受类型std::ostream::operator<<(bool)
的左值作为其左操作数,并且都接受类型std::ostream
的值作为其右操作数,两者都不是比另一个好。