如何实现接受参数的自定义流操纵器?



例如,我想要一个流操纵器,我可以将uint8_t(unsigned char)传递给它并输出它(例如):

000fa6.

我知道有可能有没有参数的流操纵器:

std::ostream &hex_format(std::ostream &out)
{
out << std::hex << std::setfill('0') << std::setw(2);
return out;
}
uint8_t x {15};
std::cout << hex_format << static_cast<int>(x); // should produce "0f"

但是如何创建一个接受参数的操纵器呢?像这样:

std::ostream &hex_format(std::ostream &out, uint8_t x)
{
out << std::hex << std::setfill('0') << std::setw(2)
<< static_cast<int>(x);
return out;
}
uint8_t x {15};
std::cout << hex_format(x); // (want to) produce "0f"

使用操纵器类:

struct hex_format {
std::uint8_t number;
hex_format(std::uint8_t x)
:number{x}
{
}
};

然后定义适当的运算符:

template <typename CharT, typename Traits>
decltype(auto) operator<<(std::basic_ostream<CharT, Traits>& os, hex_format rhs)
{
return os << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(x);
}

题外话:实际上,这将全局修改流的状态并影响以后的流操作。 您可以通过保存状态来解决此问题:

template <typename CharT, typename Traits>
decltype(auto) operator<<(std::basic_ostream<CharT, Traits>& os, hex_format rhs)
{
auto flags = os.flags();
os << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(x);
os.flags(flags);
return os;
}

最新更新