C では、特定の iomanip マニピュレータは「スティッキー」として知られる動作を示し、次の時点までストリームに影響を与え続けます。明示的にリセットします。この動作は、次のコード スニペットに見られるように、予期しない結果を引き起こす可能性があります:
std::stringstream ss; ss.fill('0'); ss.setf(ios::right, ios::adjustfield); ss << setw(2) << timestruct.tm_mday; ss << timestruct.tm_hour; ss << timestruct.tm_min; std::string filingTime = ss.str(); // BAD: '0794'
この例では、setw() マニピュレーターが tm_mday フィールドを幅 2 でフォーマットし、右揃えにすることを想定しています。出力。ただし、tm_hour と tm_min はフォーマットされずに出力されます。これは、setw() が「スティッキー」マニピュレーターではないためです。つまり、次の挿入操作にのみ影響します。
コメントでの議論に基づいて、次のようになります。マニピュレーターは次のように分類されます'sticky':
これらのマニピュレータはすべてオブジェクトを返しますストリームではなく、ストリームに挿入される次のオブジェクトに対してのみ操作を実行することを示します。
これらマニピュレータは、後続の操作の状態に影響を与えることなく、ストリーム自体に対して操作を実行します。
特に、setw() は、ストリーム上で異なる動作をするように見える唯一のマニピュレータです。作者のシステム。これは「スティッキー」マニピュレータではありませんが、次のコードに示すように、カスタム形式オブジェクトを使用したマニピュレータと同じように動作させることができます。
#include <iostream> #include <iomanip> struct SquareBracktAroundNextItem { SquareBracktAroundNextItem(std::ostream& str) : m_str(str) {} std::ostream& m_str; }; struct PutSquareBracket {}; SquareBracktAroundNextItem operator<<(std::ostream& str, PutSquareBracket const& data) { return SquareBracktAroundNextItem(str); } template<typename T> std::ostream& operator<<(SquareBracktAroundNextItem const& bracket, T const& data) { std::ios_base::fmtflags flags = bracket.m_str.flags(); std::streamsize currentPrecision = bracket.m_str.precision(); bracket.m_str << '[' << std::fixed << std::setprecision(10) << data << std::setprecision(currentPrecision) << ']'; bracket.m_str.flags(flags); return bracket.m_str; } int main() { std::cout << 5.34 << "\n" // Before << PutSquareBracket() << 5.34 << "\n" // Temp change settings. << 5.34 << "\n"; // After }
出力:
5.34 [5.3400000000] 5.34
要約すると、C のほとんどの iomanip マニピュレータは「スティッキー」です。つまり、明示的にリセットされるまでストリームに影響を与え続けます。 setw() は注目すべき例外ですが、カスタム フォーマット オブジェクトを使用して「スティッキー」にすることができます。
以上が一部の C イオマニピュレータが「粘着性」動作を示すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。