我有一个名为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;
使用operator;
Stream& operator<<(std::ios_base& b) { stream_.setf(b.flags()); return *this; }
从我的理解,因为std :: hex返回std :: ios_base所以它应该调用它并设置streams的标志。但它总是称之为模板。注意:如果我删除这个模板,一切都和你期望的一样好,但有两种方法可以同时使用吗?
如果您需要更多说明,请随时进一步询问
答案 0 :(得分:0)
IOStream操纵器不是std::ios_base
类型的对象,它们是获取和返回std::ios_base
引用的函数。因此,当您想要对这些对象进行流插入时,您必须为函数指针重载:
Stream& operator<<(std::ios_base& (*manip)(std::ios_base&))
// ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
{
manip(this->stream);
return *this;
}