使用ofstream * wrapper类,重载<< endl上的运算符

时间:2013-03-05 02:54:03

标签: c++ operator-overloading function-pointers ofstream endl

C ++

这是尝试创建一个类,它模仿使用<<的{​​{1}}运算符的输出行为,只要能够使用ofstream并写{{1 s关注。该类有一个数据成员,std::endl指针。该类有两个重载的string运算符,一个采用ofstream,另一个采用指向函数的指针,其参数为<<引用并返回std::string引用。根据{{​​3}},这是ostream的签名。从技术上讲,以下程序适用于给定的输入。它能够打印到文件,由两个ostream分隔的两行文本。但是,我希望我的 -string参数重载std::endl运算符仅接受std::endl,而不是仅仅匹配其签名的内容。我尝试了将<<放在参数列表中的各种组合,包括和不包含std::endl以及有和没有std::endl,但我得到了每个组合的编译器错误。 C ++ 11的答案也很受欢迎。

*

输出:

&

2 个答案:

答案 0 :(得分:2)

如果我查看我的ostream头文件,我会看到endl

template<typename _CharT, typename _Traits> inline basic_ostream<_CharT, _Traits>&
  endl(basic_ostream<_CharT, _Traits>& __os)
  {
     return flush(__os.put(__os.widen('\n')));
  }

因此看起来您需要继承basic_ostream才能使其正常工作。不确定你真的想这样做。

答案 1 :(得分:1)

据我所知,在编译时无法将参数强制为特定值 如果不需要编译时强制执行,则可以使用这样的简单断言来强制参数为std::endl

assert(static_cast<std::ostream& (*) (std::ostream& os)>(&std::endl) == endlPar);