我有一个自定义的日志记录类,它通过模板化的iostream支持operator << -syntax:

template< class T >
MyLoggingClass & operator <<(MyLoggingClass &, const T &) {
    // do stuff
}

我还有这个运算符的专用版本,应该在日志消息完成后调用它:
template< >
MyLoggingClass & operator <<(MyLoggingClass &, consts EndOfMessageType &){
    // build the message and process it
}
EndOfMessageType的定义如下:
class EndOfMessageType {};
const EndOfMessageType eom = EndOfMessageType( );

定义了全局常量eom,以便用户可以像在日志消息末尾的std::endl一样使用它。我的问题是,此解决方案有什么陷阱,还是有一些确定的模式可以做到这一点?

提前致谢!

最佳答案

std::endl是一个函数,而不是对象,并且operator<<重载以接受指向函数的指针,该指针采用并返回对ostream的引用。此重载仅调用函数并传递*this

#include <iostream>

int main()
{
    std::cout << "Let's end this line now";
    std::endl(std::cout); //this is the result of cout << endl, or cout << &endl ;)
}

只是要考虑的替代方法。

顺便说一句,我认为没有必要专门化运算符:即使不是更好,普通的重载也一样。

09-06 12:10