当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《丢弃需要输出迭代器的函数的输出》经验,为你挑选了1个好方法。

假设C++中有一个模板函数可以完成一些有用的工作,但也可以通过输出迭代器输出一系列值.现在假设这个值序列有时很有趣,但在其他值上没有用.在STL中是否有一个可以实例化的迭代器类,它可以被实例化并传递给函数,并将忽略函数尝试分配给输出迭代器的任何值?换句话说,将所有数据发送到/ dev/null?



1> Johannes Sch..:

STL不提供这样的迭代器.但你可以自己编写代码(测试代码):

struct null_output_iterator : 
    std::iterator< std::output_iterator_tag,
                   null_output_iterator > {
    /* no-op assignment */
    template
    void 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*:我们只使用迭代器本身.请注意,模板化运算符=不会覆盖内置复制赋值运算符.它仍然提供.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有