2

c++ 标准如何定义对操纵器的识别或一般的操纵器?

例如:

using namespace std;
ostream& hello_manip(ostream& os){
  os<<"Hello there, fine fellow!"; return os;
}
int main(){
  cout<<hello_manip;
} 

代码cout << hello_manip似乎被翻译成operator<<( cout, hello_manip )cout.operator<<(hello_manip),但它采用了hello_manip( cout )的形式。

4

1 回答 1

8

有一个重载operator<<接受一个函数指针并调用它。不涉及魔法。

标准的第 27.7.3.6.3 节描述了对像您这样的简单机械手的处理。

basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& (*pf) basic_ostream<charT,traits>&))

  1. 影响:无。不作为格式化输出函数(如 27.7.3.6.1 中所述)。
  2. 回报:pf(*this)

basic_ostream<charT,traits>& operator<<(basic_ios<charT,traits>& (*pf) basic_ios<charT,traits>&))

  1. 效果:呼叫pf(*this)。此插入器不作为格式化输出函数(如 27.7.3.6.1 中所述)。
  2. 回报:*this

basic_ostream<charT,traits>& operator<<(ios_base& (*pf)(ios_base&))

  1. 效果:呼叫pf(*this)。此插入器不作为格式化输出函数(如 27.7.3.6.1 中所述)。
  2. 回报:*this

更复杂的操纵器(接受参数和携带状态)是通过返回具有自己operator<<重载的函子对象来实现的。

于 2012-06-01T21:11:05.450 回答