vas*_*sia 3 c++ cout stringstream ostringstream c++17
使用c++17
我有一个头文件colors.hpp来帮助我将彩色输出到标准输出:
#pragma once
#include <string>
namespace Color
{
static const std::string yellow = "\u001b[33m";
static const std::string green = "\u001b[32m";
static const std::string red = "\u001b[31m";
static const std::string end = "\u001b[0m";
}
Run Code Online (Sandbox Code Playgroud)
我经常这样使用它:
std::cout << Color::green << "some green text " << Color::end << std::endl;
Run Code Online (Sandbox Code Playgroud)
我几乎总是紧随std::endl其后Color::end。我希望能够实现相同的结果(换行+缓冲区刷新),但仅使用一个变量 - 例如Color::endl.
我只能提出解决方案string,据我所知,这些解决方案将包含该\n字符,但也不会强制刷新到标准输出。
static const std::string endl = std::ostringstream(static_cast<std::ostringstream &&>(std::ostringstream() << Color::end << std::endl)).str();
Run Code Online (Sandbox Code Playgroud)
如果我从上面的代码中删除.str(),那么我就不能这样做:
std::cout << Color::endl;因为
error: invalid operands to binary expression ('basic_ostream<char>' and 'const std::__1::basic_ostringstream<char>')
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 10
std::endl是一个函数(实际上是函数模板),而不是一个对象。这意味着,如果你想复制它,你还需要一个函数。
如果您将其添加到Color:
template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os )
{
return os << end << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
然后,当你使用这个时:
std::cout << Color::green << "some green text " << Color::endl;
Run Code Online (Sandbox Code Playgroud)
该Color::endl()函数将被调用,然后它可以插入Color::end到流中,然后std::endl获得您想要的换行符和刷新行为,如本实例所示。