如何实现C++中类似/dev/null的空输出迭代器?替代std::ignore
解决方案:自定义“空输出迭代器”直接丢弃数据
你可以自己实现一个极简的输出迭代器,所有操作都为空,完全不存储任何数据,完美替代需要丢弃的输出参数:
#include <iterator> struct null_output_iterator { // 输出迭代器必须定义的类型别名 using iterator_category = std::output_iterator_tag; using value_type = void; using difference_type = void; using pointer = void; using reference = void; // 接收任意类型的赋值,什么都不做 template <typename T> null_output_iterator& operator=(const T&) { return *this; } // 前置自增,空操作 null_output_iterator& operator++() { return *this; } // 后置自增,空操作 null_output_iterator operator++(int) { return *this; } // 解引用,返回自身 null_output_iterator& operator*() { return *this; } };
使用方式
直接用这个迭代器替代原来的std::back_inserter(vals_Y)即可:
std::vector<X> vals_X; f(std::back_inserter(vals_X), null_output_iterator{});
为什么这个可行
输出迭代器只需要满足最基础的操作要求:支持*it = value、++it和it++。这个自定义迭代器的所有操作都是空实现,既不会分配内存,也不会存储任何数据,完全符合“输出到/dev/null”的需求。
为什么std::ignore不行
std::ignore只是tuple解包时用来忽略元素的标记对象,它没有输出迭代器必需的operator++、operator*等成员函数,所以无法被函数f当作输出迭代器使用,会触发编译错误。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

