C++ 函数中输出容器默认值的开始

C++ 函数中输出容器默认值的开始,c++,c++11,iterator,optional-parameters,C++,C++11,Iterator,Optional Parameters,我有以下减速功能: template<class Tinput_iterator, class Toutput_iterator> int foo(const Tinput_iterator& begin_input, const Tinput_iterator& end_input, Toutput_iterator& begin_output); 编辑: 如果begin\u output是这样传递的,例如: std::vector<int>

我有以下减速功能:

template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input, const Tinput_iterator& end_input, Toutput_iterator& begin_output);
编辑:

如果
begin\u output
是这样传递的,例如:

std::vector<int> bar(data.size());
auto result=foo(begin(data),end(data),begin(bar));
结果
将包含一个
整数
(同上)


当然,没有
,也不会存储任何内容

最明显的解决方案是使用默认构造的迭代器作为默认值

模板
int foo(Tinput迭代器开始输入,Tinput迭代器结束输入,Toutput迭代器开始输出={});
顺便说一下,这一切都取决于
Toutput\u迭代器的定义方式。如果迭代器是按照标准库迭代器的思路设计的,那就好了。它也适用于指针(默认值为
nullptr


注意,我已经从
foo
的参数声明中删除了引用。这是因为迭代器通常设计为按值传递。

另一个选项是重载
foo

template<class Tinput_iterator>
int foo(const Tinput_iterator& begin_input, 
        const Tinput_iterator& end_input) {}

template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input,
        const Tinput_iterator& end_input, Toutput_iterator& begin_output) {}
模板
int foo(常量输入迭代器&开始输入,
常量Tinput_迭代器和end_输入{}
模板
int foo(常量输入迭代器&开始输入,
常量Tinput_迭代器和end_输入,Toutput_迭代器和begin_输出{}

我认为这取决于
foo
的功能以及如何使用默认值。你能提供更多细节吗?我非常怀疑通过引用const来设置开始和结束迭代器是否是一个好主意。我认为通过值传递它们更合适,因为您无论如何都要复制begin。@TartanLlama我已经编辑了我的question@ArmenTsirunyan这只是一个习惯,通过每件事使用常数&。。你能告诉我这里的问题是什么吗?顺便说一句,我认为这是std算法中使用的方法(至少在我的编译器实现它的时候)。你认为出于某种原因它更受欢迎吗?@HumamHelfawi此方法对迭代器实现免疫。对于某些迭代器,
it={}
将不起作用。您必须指定当前某处的
Toutput\u迭代器的类型…:-/@Jarod42抱歉,我无法理解
foo(c.begin(),c.end())
,这是
begin\u输出的类型(无法推断)。@PaoloM我忘了问你,在函数体中如何检查迭代器是否未传递,是否有默认值?thanks@HumamHelfawi只需对照
Toutput_迭代器def_value{}
auto result=foo(begin(data),end(data)/*,begin(bar)*/);
template<class Tinput_iterator, class Toutput_iterator = void*>
int foo(Tinput_iterator begin_input, Tinput_iterator end_input, Toutput_iterator begin_output = {});
template<class Tinput_iterator>
int foo(const Tinput_iterator& begin_input, 
        const Tinput_iterator& end_input) {}

template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input,
        const Tinput_iterator& end_input, Toutput_iterator& begin_output) {}