namespace {
// We maintain the value returned by ios::xalloc() + 1, and not
// the value itself. The actual value may be zero, and we need
// to be able to distinguish it from the 0 resulting from 0
// initialization. The function getXAlloc() returns this value
// -1, so we add one in the initialization.
int getXAlloc();
int ourXAlloc = getXAlloc() + 1;
int
getXAlloc()
{
if ( ourXAlloc == 0 ) {
ourXAlloc = std::ios::xalloc() + 1;
assert( ourXAlloc != 0 );
}
return ourXAlloc - 1;
}
}
StateSavingManip::StateSavingManip()
: myStream( NULL )
{
}
StateSavingManip::StateSavingManip(
StateSavingManip const&
other )
{
assert( other.myStream == NULL );
}
StateSavingManip::~StateSavingManip()
{
if ( myStream != NULL ) {
myStream->flags( mySavedFlags );
myStream->precision( mySavedPrec );
myStream->fill( mySavedFill );
myStream->pword( getXAlloc() ) = NULL;
}
}
void
StateSavingManip::operator()(
std::ios& stream ) const
{
void*& backptr = stream.pword( getXAlloc() );
if ( backptr == NULL ) {
backptr = const_cast< StateSavingManip* >( this );
myStream = &stream;
mySavedFlags = stream.flags();
mySavedPrec = stream.precision();
mySavedFill = stream.fill();
}
setState( stream );
}
8条答案
按热度按时间dbf7pr2w1#
您需要添加
您需要stream manipulators
你可以用任何你想要的字符来“填充”空白的地方,就像这样:
0g0grzrc2#
你必须要
lsmepo6l3#
在C++20中你可以做
或
在C++20之前的版本中,您可以使用the {fmt} library,它提供了
format_to_n
的实现。std::format
的作者。nwsw7zdq4#
通常,您希望避免在输出点指定
11
和6
之类的内容,这是物理标记,而您希望使用逻辑标记;例如pressure
或volume
。这样,您可以在一个位置定义如何格式化压力或体积,并且如果格式发生变化,您不必搜索整个程序以查找在哪里更改格式(并意外地更改其他内容的格式)在C++中,您可以通过定义一个操纵器来实现这一点,该操纵器设置各种格式选项,最好在完整表达式的末尾恢复它们。所以你最后会写这样的东西:虽然我绝对不会在生产代码中使用它,但我发现下面的
FFmt
化程序对于快速工作很有用:这允许写入如下内容:
另外,为了记录在案:
StateSavingManip.cc:
sg3maiej5#
jtw3ybtb6#
对于更喜欢使用std::ostream的printf风格格式规范的未来访问者,这里还有另一个变体,基于Martin York在另一个SO问题中的精彩帖子:https://stackoverflow.com/a/535636:
用法示例:
或者甚至:
jm81lzqq7#
这是我,OP,Jive Dadson -五年过去了。C++17正在成为现实。
带有完美转发功能的可变模板参数的出现让生活变得简单多了。ostream〈〈和boost::format%的连锁疯狂可以省去。下面的函数oprintf填补了这一空白。工作正在进行中。请随意加入错误处理等内容...
vatpfxk58#
已经有一些很好的答案了;向他们致敬!
我已经为POD类型添加了类型Assert,因为它们是
printf()
可用的唯一安全类型。示例用法如下。
Give it a try on Coliru .