如何实现能够接受IO操纵器的StringBuilder类 我编写了以下实用工具C++类.< /P> /*! * \brief The \b StringBuilder class is used for efficiently constructing long * strings out of many small ones. Internally it uses \b std::ostringstream and * its advantage compared to usage of raw \b std::ostringstream is that it is * capable to be used on single line and implicitly converted to \b std::string * everywhere this type is expected. * \code{.cpp} * void foo(const std::string& s); * foo(utils::StringBuilder("The answer is: ") << 42 << std::endl); * \endcode */ class StringBuilder { public: StringBuilder() = default; template <class... Args> explicit StringBuilder(Args&&... args) { append(std::forward<Args>(args)...); } template <class T> StringBuilder& append(const T& arg) { _data << arg; return *this; } template <class T, class... Args> StringBuilder& append(const T& arg, Args&&... args) { _data << arg; append(std::forward<Args>(args)...); return *this; } std::string toString() const { return _data.str(); } operator std::string() const { return toString(); } template <class T> StringBuilder& operator<<(const T& object) { return append(object); } private: std::ostringstream _data; }; /*! *\brief\b StringBuilder类用于高效地构造长 *从许多小的串。它在内部使用\b std::ostringstream和 *与使用raw\b std::ostringstream相比,它的优势在于 *能够在单行上使用并隐式转换为\b std::string *在任何地方都会出现这种情况。 *\code{.cpp} *void foo(const std::string&s); *foo(utils::StringBuilder(“答案是:”)

如何实现能够接受IO操纵器的StringBuilder类 我编写了以下实用工具C++类.< /P> /*! * \brief The \b StringBuilder class is used for efficiently constructing long * strings out of many small ones. Internally it uses \b std::ostringstream and * its advantage compared to usage of raw \b std::ostringstream is that it is * capable to be used on single line and implicitly converted to \b std::string * everywhere this type is expected. * \code{.cpp} * void foo(const std::string& s); * foo(utils::StringBuilder("The answer is: ") << 42 << std::endl); * \endcode */ class StringBuilder { public: StringBuilder() = default; template <class... Args> explicit StringBuilder(Args&&... args) { append(std::forward<Args>(args)...); } template <class T> StringBuilder& append(const T& arg) { _data << arg; return *this; } template <class T, class... Args> StringBuilder& append(const T& arg, Args&&... args) { _data << arg; append(std::forward<Args>(args)...); return *this; } std::string toString() const { return _data.str(); } operator std::string() const { return toString(); } template <class T> StringBuilder& operator<<(const T& object) { return append(object); } private: std::ostringstream _data; }; /*! *\brief\b StringBuilder类用于高效地构造长 *从许多小的串。它在内部使用\b std::ostringstream和 *与使用raw\b std::ostringstream相比,它的优势在于 *能够在单行上使用并隐式转换为\b std::string *在任何地方都会出现这种情况。 *\code{.cpp} *void foo(const std::string&s); *foo(utils::StringBuilder(“答案是:”),c++,stl,C++,Stl,endl(以及iomanip操作数)是一个函数 写一个像这样的重载 StringBuilder& operator<<(ostream& func(ostream&)) { _data << func; return *this; } StringBuilder& operator<<(StringBuilder& sb, ostream& func(ostream&)) ... St

endl(以及iomanip操作数)是一个函数

写一个像这样的重载

StringBuilder& operator<<(ostream& func(ostream&))
{
    _data << func;
    return *this;
}
StringBuilder& operator<<(StringBuilder& sb, ostream& func(ostream&)) ...

StringBuilder&operatorDoesn还没有这样做?你自己实际需要什么?我在上面的评论中描述了这种需要。你能解释一下为什么这可以在类
Operator中使用,因为endl是一个带有
ostream
的函数,而不是
ostringstream
参数/返回值。我不确定为什么它不能作为一个函数使用外部运算符为您提供。它为我提供。只需将其作为成员编写,就像我所做的那样。但是
std::ostringstream
是从
std::ostream
派生的。为什么没有隐式downcast?