【问题标题】:Using ofstream* wrapper class with overloaded << operator on endl在 endl 上使用带有重载 << 运算符的 ofstream* 包装类
【发布时间】:2013-03-05 02:54:02
【问题描述】:

C++

这是一个尝试创建一个模拟使用ofstream&lt;&lt; 运算符的输出行为的类,就能够使用std::endl 和编写strings 而言。该类有一个数据成员,ofstream 指针。该类有两个重载的&lt;&lt; 运算符,一个采用std::string,另一个采用指向函数的指针,其参数是ostream 引用并返回ostream 引用。那是std::endl的签名,根据this。从技术上讲,以下程序适用于给定的输入。它能够打印到文件,两行文本由两个std::endls 分隔。但是,我希望我的 non-string 参数重载 &lt;&lt; 运算符只接受 std::endl,而不是仅仅匹配其签名的东西。我尝试了将std::endl放在参数列表中的各种组合,有和没有*,有和没有&amp;,但每个组合都出现编译器错误。也欢迎 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.

【问题讨论】:

  • 做这种事情的正确方法是创建一个std::streambuf的派生类。

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


【解决方案1】:

如果我查看我的 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 继承才能使这项工作。不确定你真的想这样做。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你需要一个强制转换才能工作,因为它是一个重载函数:assert(static_cast&lt;std::ostream&amp; (*)(std::ostream&amp;)&gt;(&amp;std::endl) == endlPar);
    • 谢谢,我做出了改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2011-06-06
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多