假设C++中有一个模板函数可以完成一些有用的工作,但也可以通过输出迭代器输出一系列值.现在假设这个值序列有时很有趣,但在其他值上没有用.在STL中是否有一个可以实例化的迭代器类,它可以被实例化并传递给函数,并将忽略函数尝试分配给输出迭代器的任何值?换句话说,将所有数据发送到/ dev/null?
Joh*_*itb 22
STL不提供这样的迭代器.但你可以自己编写代码(测试代码):
struct null_output_iterator :
std::iterator< std::output_iterator_tag,
null_output_iterator > {
/* no-op assignment */
template<typename T>
void operator=(T const&) { }
null_output_iterator & operator++() {
return *this;
}
null_output_iterator operator++(int) {
return *this;
}
null_output_iterator & operator*() { return *this; }
};
Run Code Online (Sandbox Code Playgroud)
作为结果,它不需要使用任何数据operator*
.结果*it = x;
是没有在输出迭代器要求中使用,所以我们可以给它一个返回类型void
.
编辑:让我们来看看它是如何operator*
工作的.标准在24.1.2/1中 说明了输出迭代器的要求,在这两种情况下:
*it = t;
*it++ = t;
Run Code Online (Sandbox Code Playgroud)
没有使用这些表达式的结果.这就是使这项工作的原因:
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=`.
Run Code Online (Sandbox Code Playgroud)
现在我们不需要返回任何数据operator*
:我们只使用迭代器本身.请注意,模板化运算符=不会覆盖内置复制赋值运算符.它仍然提供.
你有可用的Boost吗?如果是这样,您可以使用function_output_iterator包装一个空函数。
但这并不理想。无论您使用什么迭代器,仍然需要创建 value_type 的实例以在操作符 * 中返回,即使它随后将其丢弃。