我想用程序替换程序中出现的每个cout
但与endl
连接。我正在尝试使用宏,但无法弄清楚如何做到这一点。请帮忙!
有没有办法在程序中编写完整的行,只是用<< endl
连接它?
请注意,如果endl
已由程序员编写,则不会连接endl
。
如果有其他更好的方法,请建议。
答案 0 :(得分:9)
只需制作一个功能模板:
template<typename T>
void printLn(T const & v, std::ostream & os = std::cout)
{
os << v << std::endl;
}
如果您想使用它并允许多个参数,并且C ++ 11可供您使用:
void printLn(std::ostream & os)
{
os << std::endl;
}
template<typename T, typename... Args>
void printLn(std::ostream & os, T const & v, Args&&... args)
{
os << v;
printLn(os, std::forward<Args>(args)...);
}
答案 1 :(得分:2)
不幸的是,这是可能的。但我绝不能宽恕它。
#include <iostream>
namespace std
{
class not_actually_cout{};
template<typename T>
not_actually_cout& operator<< (not_actually_cout& stream, const T & v)
{
std::cout << v << std::endl;
return stream;
}
not_actually_cout not_actually_cout_instance;
}
#define cout not_actually_cout_instance
int main(void)
{
cout << "why god why";
cout << "please no";
return 0;
}
输出:
why god why
please no
答案 2 :(得分:1)
你真正感兴趣的是什么?每次输出操作或刷新后的换行符?请注意,同花顺非常昂贵。
在每次输出操作后注入flush的最简单方法是设置标志std::ios_base::unitbuf
(这是std::cerr
的默认设置):
std::cout << std::unitbuf;
在此操作之后,您将在每次单独输出操作后获得刷新,例如
std::cout << "hello" << ' ' << "world\n";
会导致三次冲洗。要自动同时插入换行符,您可以设置一个过滤流缓冲区,在刷新流时添加换行符(可选地,如果没有换行符)。除了设置overflow()
之外,这相当于覆盖sync()
的{{1}}和std::streambuf
函数,并将相应的流缓冲区安装到std::cout
。通过这些更改,不需要更改源。
下面的代码演示了相应的过滤流缓冲区:
std::unitbuf
根据评论,我意识到这可能不是你想要的,但我不知道只是使用预处理器和/或编译器添加换行符的便携式技术。
答案 3 :(得分:0)
尝试使用正则表达式。所有现代语言都支持它们。
另外,例如,如果您的程序不是那么大,您可以尝试使用SublimeText编辑器。它有非常智能的替换工具,支持正则表达式。