它不是一个完美的解决方案(但如果不阅读 iostream 库,我现在想不出另一种方法)。
假设你的机械手是:
class MaxFieldSize {/*STUFF*/};
当您编写流操作符时,您会编写一个稍微时髦的操作符,它不会返回实际的流(而是返回一个带有包装器的流)。
MaxFieldWdithStream operator<<(std::ostream&, MaxFieldSize const& manip);
现在,您重载此类的所有流运算符以在返回普通流对象之前截断它们的输入。
class MaxFieldWithStream { std::ostream& printTruncatedData(std::string& value);};
那么你所需要的只是泛型重载:
template<typename T>
std::ostream& operator<<(MaxFieldWithStream& mfwstream, T const& value)
{
std::stringstream trunStream;
trunStream << value;
return mfwstream.printTruncatedData(trunStream.substr(0, mfwstream.widthNeeded));
}
// You will probably need another overload for io-manipulators.
我还将添加一个转换运算符,自动将 MaxFieldWithStream 转换为 std::iostream ,这样如果将其传递给函数,它的行为仍然像流一样(尽管它会失去其最大宽度属性)。
class MaxFieldWithStream
{
std::ostream& printTruncatedData(std::string& value);};
operator st::ostream&() const { return BLABLAVLA;}
};