在C ++中从父命名空间访问隐藏的运算符

时间:2015-07-17 05:26:58

标签: c++ operators

我想拦截运营商<<在命名空间内,在打印出来之前为基本类型添加一些额外的格式。可以这样做吗?

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;
    }
}

谢谢!

1 个答案:

答案 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的值作为其右操作数,两者都不是比另一个好。