假设C++中有一个模板函数可以完成一些有用的工作,但也可以通过输出迭代器输出一系列值.现在假设这个值序列有时很有趣,但在其他值上没有用.在STL中是否有一个可以实例化的迭代器类,它可以被实例化并传递给函数,并将忽略函数尝试分配给输出迭代器的任何值?换句话说,将所有数据发送到/ dev/null?
STL不提供这样的迭代器.但你可以自己编写代码(测试代码):
struct null_output_iterator : std::iterator< std::output_iterator_tag, null_output_iterator > { /* no-op assignment */ templatevoid operator=(T const&) { } null_output_iterator & operator++() { return *this; } null_output_iterator operator++(int) { return *this; } null_output_iterator & operator*() { return *this; } };
作为结果,它不需要使用任何数据operator*
.结果*it = x;
是没有在输出迭代器要求中使用,所以我们可以给它一个返回类型void
.
编辑:让我们来看看它是如何operator*
工作的.标准在24.1.2/1中 说明了输出迭代器的要求,在这两种情况下:
*it = t; *it++ = t;
没有使用这些表达式的结果.这就是使这项工作的原因:
null_output_iterator it; *it; // returns a null_output_iterator& per definition of the `operator*`. *it = some_value; // returns void per definition of the templated `operator=`.
现在我们不需要返回任何数据operator*
:我们只使用迭代器本身.请注意,模板化运算符=不会覆盖内置复制赋值运算符.它仍然提供.