丢弃需要输出迭代器的函数的输出

Dav*_*eis 20 c++ iterator stl

假设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*:我们只使用迭代器本身.请注意,模板化运算符=不会覆盖内置复制赋值运算符.它仍然提供.


Ala*_*air 4

你有可用的Boost吗?如果是这样,您可以使用function_output_iterator包装一个空函数。

但这并不理想。无论您使用什么迭代器,仍然需要创建 value_type 的实例以在操作符 * 中返回,即使它随后将其丢弃。