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

Begin of output container default value in a function

我有以下减速功能:

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

数据容器(begin_input & end_input)的beginend是必须的。但是,输出容器(end_input)的begin是可选的。

在这种情况下,我应该用什么代替 XXX:

template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input, const Tinput_iterator& end_input, Toutput_iterator& begin_output = XXX);

编辑:

如果 begin_output 是这样传递的,例如:

std::vector<int> bar(data.size());
auto result=foo(begin(data),end(data),begin(bar));

result 将包含一个 integer

bar 将包含 integers.

的 100 个值

如果这样调用:

auto result=foo(begin(data),end(data)/*,begin(bar)*/);

result 将包含一个 integer(同上)

当然没有bar也不会存储任何东西

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

template<class Tinput_iterator, class Toutput_iterator = void*>
int foo(Tinput_iterator begin_input, Tinput_iterator end_input, Toutput_iterator begin_output = {});

顺便说一下,这完全取决于 Toutput_iterator 是如何定义的。如果迭代器是按照标准库迭代器的方式设计的,那就没问题了。它也适用于指针(默认值为 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) {}