0

C++

就能够使用和编写s 而言,这是一种尝试创建一个模仿使用<<an 运算符的输出行为的类。该类有一个数据成员,即指针。该类有两个重载运算符,一个接受 an ,另一个接受指向函数的指针,其参数是引用并返回引用。是的签名,据此。从技术上讲,以下程序适用于给定的输入。它能够打印到文件,两行文本由两个s 分隔。但是,我希望我的字符串参数重载运算符接受ofstreamstd::endlstringofstream<<std::stringostreamostreamstd::endlstd::endl<<std::endl只是,而不是仅仅与它的签名相匹配的东西。std::endl我尝试了在参数列表中放置的各种组合,有和没有*以及有和没有&,但我得到了每个组合的编译器错误。也欢迎 C++11 答案。

#include <fstream>
#include <iostream>
#include <string>

class TextOut
{
public:
    TextOut(std::ofstream* ofsPar) : ofs(ofsPar) {}
    TextOut& operator<<(std::string s)
    {
        *ofs << s;
        return *this;
    }
    TextOut& operator<<(std::ostream& (*endlPar) (std::ostream& os))
    {
        *ofs << std::endl;
        return *this;
    }
private:
    std::ofstream* ofs;
};

int main()
{
    std::cout << "Enter filename: ";
    std::string filename;
    std::cin >> filename;
    std::ofstream myofstream(filename.c_str());
    TextOut myTextOut(&myofstream);
    myTextOut << "Hello," << std::endl << std::endl << "spacious world.";
    return 0;
}

输出:

Hello,

spacious world.
4

2 回答 2

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才能完成这项工作。不确定你真的想这样做。

于 2013-03-05T03:20:18.473 回答
1

据我所知,没有办法在编译时强制参数为特定值。
如果编译时强制不是必需的,您可以使用这样的简单断言来强制参数为std::endl

assert(static_cast<std::ostream& (*) (std::ostream& os)>(&std::endl) == endlPar);
于 2013-03-05T03:07:07.853 回答