如何声明接收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
相关产品推荐
相关产品推荐

