这是一个简单的示例,演示了如何使用类定义一个带有一个参数的用户自定义操作符:
#include <iostream>
class putX // injects some `X`s into the stream
{
std::size_t _n;
public:
explicit putX(std::size_t n): _n(n) {}
std::size_t getn() const {return _n;}
friend std::ostream& operator<<(std::ostream& os, const putX& obj)
{
std::size_t n = obj.getn();
for (std::size_t i = 0; i < n; ++i)
os << 'X';
return os;
}
};
int main()
{
std::cout << putX(10) << " test " << putX(10);
}
没有参数的操作符可以直接实现为
std::ostream& custom_manip(std::ostream& os) { // do something with os and return os;}
那是因为 basic_ostream::operator<<
有一个重载,它以指向函数的指针 std::ostream& (*fp)(std::ostream&)
作为其右操作数(例如,一个控制器)。
PS:N. Josuttis 的《C++标准库》详细描述了操作符和自定义操作符的工作原理。请参见第15.6.3节用户定义的操作符。
std::ostream& std::ostream::operator<<( std::ostream& (*fp)(std::ostream&, param1, param2... ))
,但这是不允许的。 - vsoftco
operator<<()
/operator>>()
重载进行这些操作。 - πάντα ῥεῖwidth
成员函数,作为访问器和变异器。据我所知,自定义添加几乎必须使用xalloc
等。 - chrisxalloc
到底是什么鬼?我看了http://www.cplusplus.com的[xalloc描述](http://www.cplusplus.com/reference/ios/ios_base/xalloc/),但对我来说并没有什么帮助。 - Jonathan Meepword
页面有一个示例,cppreference也有。 - chris