2012-06-01 94 views
2

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

例如:

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

代码COUT < < hello_manip似乎被翻译成操作者< <(COUT,hello_manip)cout.operator < <(hello_manip),但取而代之的是形式hello_manip(cout)

回答

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<<重载实现。

+0

哦,哇,我怎么错过了。现在这是完全意义上的。我甚至不知道我是否应该在这里留下这个问题 - 这可能看起来有误导性。 – Eximius

+0

@Eximius,你应该保持它,以防其他人出现并找到它。他们可能会有和你一样的尤里卡。 – chris