You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:09:59