c++ - 在 endl 上使用带有重载 << 运算符的 ofstream* 包装类

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

C++

这是尝试创建一个模拟使用 << 的输出行为的类ofstream 的运算符(operator),只要能够使用 std::endl然后写string s有关。该类有一个数据成员,ofstream。指针。该类有两个重载 <<运算符,需要一个 std::string另一个接受指向函数的指针,其参数是 ostream。引用并返回 ostream引用。那就是std::endl的签名, 根据 this .从技术上讲,以下程序适用于给定的输入。它能够打印到文件,两行文本由两个分隔 std::endl秒。但是,我希望我的-string 参数重载 <<接线员接受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.

最佳答案

如果我查看我的 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 才能完成这项工作。不确定您是否真的想这样做。

关于c++ - 在 endl 上使用带有重载 << 运算符的 ofstream* 包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215010/

相关文章:

C++编译错误;流运算符重载

c++结构运算符重载不起作用

c++ - 重载赋值运算符 带下标运算符

c - 如何解释这个c typedef

c++ - 模板非类型模板化引用参数

c++ - sprintf 比 print 占用更多空间?

c++ - 从函数返回指针。一个指针的值未更新

python - Python函数指针的类型

c++ - 有没有办法在宏中将 decltype 转换为字符串?

c++ - 基于范围的 for 循环内的 const 自动引用的生命周期是否延伸到范围的末尾?