首页
学习
活动
专区
圈层
工具
发布

自动endl
EN

Stack Overflow用户
提问于 2011-12-14 18:52:50
回答 4查看 1.4K关注 0票数 8

我希望实现类MyCout,它可以提供自动endl的可能性,即这段代码

代码语言:javascript
复制
MyCout mycout;
mycout<<1<<2<<3;

输出

代码语言:javascript
复制
123
//empty line here

有可能用这样的功能实现类吗?

更新: Soulutions不应该像MyCout()<<1<<2<<3;那样,也就是说,它们不应该创建临时对象

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-14 20:01:49

这只是Rob's answer的一个变体,它不使用堆。这是一个足够大的变化,我不想仅仅改变他的答案

代码语言:javascript
复制
struct MyCout {
  MyCout(std::ostream& os = std::cout) : os(os) {}
  struct A {
    A(std::ostream& r) : os(r), live(true) {}
    A(A& r) : os(r.os), live(true) {r.live=false;}
    A(A&& r) : os(r.os), live(true) {r.live=false;}
    ~A() { if(live) {os << std::endl;} }
    std::ostream& os;
    bool live;
  };
  std::ostream& os;
};

template <class T>
MyCout::A operator<<(MyCout::A&& a, const T& t) {
  a.os << t;
  return a;
}

template<class T>
MyCout::A operator<<(MyCout& m, const T& t) { return MyCout::A(m.os) << t; }

int main () {
  MyCout mycout;
  mycout << 1 << 2.0 << '3';
  mycout << 3 << 4.0 << '5';
  MyCout mycerr(std::cerr);
  mycerr << 6 << "Hello, world" << "!";
}
票数 2
EN

Stack Overflow用户

发布于 2011-12-14 18:54:47

您可以使用临时对象的析构函数来刷新流并打印换行符。Qt调试系统实现了这一点,this answer描述了如何做到这一点。

票数 8
EN

Stack Overflow用户

发布于 2011-12-14 19:02:25

以下是C++11中的工作:

代码语言:javascript
复制
#include <iostream>

struct myout_base { };
struct myout
{
  bool alive;
  myout() : alive(true) { }
  myout(myout && rhs) : alive(true) { rhs.alive = false; }
  myout(myout const &) = delete;
  ~myout() { if (alive) std::cout << std::endl; }
};

template <typename T>
myout operator<<(myout && o, T const & x)
{
  std::cout << x;
  return std::move(o);
}

template <typename T>
myout operator<<(myout_base &, T const & x)
{
  return std::move(myout() << x);
}

myout_base m_out;   // like the global std::cout

int main()
{
  m_out << 1 << 2 << 3;
}

通过更多的工作,您可以添加对实际输出流的引用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8510071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档