创建一个包含字符串和 std::endl 的变量,该变量可在输出流中用于 std::cout。

3

使用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";
}

我经常这样使用它:
std::cout << Color::green << "some green text " << Color::end << std::endl;

我几乎总是在Color::end后立即加上std::endl。我希望能够实现相同的效果(换行符和缓冲区刷新),但只使用一个变量 - 类似于Color::endl

我只能想到string类型的解决方案,但据我所知,它将包括\n字符,但不会强制刷新到标准输出(stdout)。

static const std::string endl = std::ostringstream(static_cast<std::ostringstream &&>(std::ostringstream() << Color::end << std::endl)).str();

如果我在上面的代码中删除 .str(),那么我将无法执行:std::cout << Color::endl;,这是因为……
error: invalid operands to binary expression ('basic_ostream<char>' and 'const std::__1::basic_ostringstream<char>')

1
你可以创建一个“io-manipulator”。 - Jarod42
一些宏相关的东西怎么样?http://ix.io/3yhN - Ghasem Ramezani
1
如果您感兴趣,可以使用以下链接自动重置颜色并终止行:https://godbolt.org/z/cMP9rjzvf - m88
1
@GhasemRamezani我有时候会在一行中使用几种不同的颜色,所以宏并不是理想的选择。我也试图避免使用宏,因为我正在尝试摆脱C99编写C ++的风格。 - vasia
1
@m88 谢谢您提供的示例,它非常有用且富有教育意义! - vasia
1个回答

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;
}

那么,当您使用这个时:

std::cout << Color::green << "some green text " << Color::endl;

Color::endl()函数将被调用,然后它可以将Color::end插入流中,然后使用std::endl获取所需的换行和刷新行为,就像在这个实时示例中所看到的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接