1

我有一个名为 Stream 的自定义类

class Stream
public:
    Stream& operator<<(int i) { stream_ << i; return *this;}
            template <typename CustomClass>
            Stream& operator<<(const CustomClass& c) { stream_ << c.toString() /* assume this template always have toString(); return *this; }
private:
    std::stringstream stream_;
};

这是我实际拥有的一个非常基本的例子。我正在尝试设置 std::ios_base 标志,如下所示:

Stream() << 1 << std::hex << 2;

使用运算符;

Stream& operator<<(std::ios_base& b) { stream_.setf(b.flags()); return *this; }

据我了解,因为 std::hex 返回 std::ios_base 所以它应该调用它并设置流的标志。但它总是调用模板。注意:如果我删除此模板,一切都会像您期望的那样工作,但有没有办法两者兼得?

如果您需要更多说明,请随时进一步询问

4

1 回答 1

0

IOStream 操纵器不是 type 的对象std::ios_base,它们是获取和返回std::ios_base引用的函数。因此,当您想要对这些对象进行流插入时,您必须重载函数指针

Stream& operator<<(std::ios_base& (*manip)(std::ios_base&))
//                 ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
{
    manip(this->stream);
    return *this;
}
于 2014-01-21T20:31:31.837 回答