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

如何声明接收T类型std::output_iterator的C++模板函数?

如何定义兼容std::insert_iterator类迭代器的函数

我需要将对象存入类型不确定的容器,打算借助C++20的std::output_iterator概念来约束函数参数。想要定义一个能接收std::insert_iterator<std::vector<T>>、std::insert_iterator<std::list<T>>这类迭代器的函数,但std::output_iterator包含两个模板参数,不确定该如何正确声明函数。我知道可以沿用<algorithm>里的旧式写法:

template<typename OutIter>
void foo(OutIter writer);

但这种写法不够直观,无法直接体现迭代器的用途。


基于C++20概念的正确实现

你尝试的代码存在模板参数声明错误,std::output_iterator概念的正确用法是指定迭代器可写入的值类型,而非额外声明迭代器类型参数。以下是修正后的代码:

#include <iterator>
#include <vector>
#include <list>

// 约束迭代器可写入const T&类型的值
template<typename T, std::output_iterator<const T&> OutIter>
void foo(OutIter writer) {
    *writer++ = T{}; // 输出迭代器的标准赋值写法
}

int main() {
    std::vector<int> ints;
    auto vec_inserter = std::insert_iterator(ints, ints.end());
    foo<int>(vec_inserter);

    std::list<std::string> strs;
    auto list_inserter = std::insert_iterator(strs, strs.end());
    foo<std::string>(list_inserter);
}

核心说明

  • std::output_iterator的模板参数是要写入的值类型,而非迭代器自身类型。比如std::insert_iterator<std::vector<int>>支持写入const int&类型,因此用std::output_iterator<const T&>作为约束更贴合实际场景(也可直接写std::output_iterator<T>,效果相近)。
  • 若不想显式指定T,可让编译器自动推导值类型,进一步简化调用:
    template<std::output_iterator<auto> OutIter>
    void foo(OutIter writer) {
        using T = typename std::iterator_traits<OutIter>::value_type;
        *writer++ = T{};
    }
    
    此时调用无需显式指定模板参数,直接写foo(vec_inserter)即可。

内容的提问来源于stack exchange,提问作者user3001150

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:30:12