Mycout自动结束
mycout automatic endl
我想实现类MyCout
,它可以提供自动结束的可能性,即以下代码
MyCout mycout;
mycout<<1<<2<<3;
输出123
//empty line here
有可能实现具有这种功能的类吗?
更新:解决方案不应该像MyCout()<<1<<2<<3;
那样,即它们不应该创建临时对象
可以使用临时对象的析构函数来刷新流并打印换行符。Qt调试系统就是这样做的,下面的答案描述了如何做。
c++ 11中的以下工作:
#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;
}
通过更多的工作,您可以添加对实际输出流的引用。
这只是Rob的答案的一个变体,它不使用堆。这是一个很大的变化,我不想只是改变他的答案
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" << "!";
}
如果您需要避免c++ 11的特性:
#include <iostream>
#include <sstream>
#include <memory>
struct MyCout {
MyCout(std::ostream& os = std::cout) : os(os) {}
struct A {
A(std::ostream& os) : os(os) {}
A() : os(os) {}
~A() { os << std::endl; }
std::ostream& os;
};
std::ostream& os;
};
template <class T>
const std::auto_ptr<MyCout::A>&
operator<<(const std::auto_ptr<MyCout::A>& a, const T& t) {
a->os << t;
return a;
}
template<class T>
const std::auto_ptr<MyCout::A>
operator<<(MyCout& m, const T& t) {
std::auto_ptr<MyCout::A> p(new MyCout::A(m.os));
p << t;
return p;
}
int main () {
MyCout mycout;
mycout << 1 << 2 << 3;
mycout << 3 << 4 << 5;
MyCout mycerr(std::cerr);
mycerr << 6 << "Hello, world" << "!";
}
相关文章:
- 为什么在这个代码结束循环中没有得到结束
- 试图对缓存进行跨步测试,但程序并没有结束
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 为什么擦除方法会影响结束方法
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 删除映射和分割错误中的一个过去结束元素
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 为什么我的两个 cin 语句没有在程序结束时运行?
- 在函数结束后使用指向变量的指针是否安全?
- C ++尝试并捕获未结束的程序
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 取消引用结束指针到数组类型的一个
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 结束另一个线程中使用的对象的生存期
- 全局向量导致 C++ 程序结束时出现段错误
- 程序显示以退出代码 0; 结束
- 如何显示函数开始、结束行和函数体?
- C++ 从具有开始位置和结束位置的列表中删除
- 使用 shared_ptr 在中断时结束多线程循环
- Mycout自动结束