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

时间:2015-11-19 11:31:36

标签: 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);

数据容器beginendbegin_input&amp; end_input)是强制性的。但是,输出容器beginend_input)是可选的。

在这种情况下,我应该把它代替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将包含100个integers值。

如果这样调用:

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

result将包含integer(与上述相同)

当然没有bar并且不会存储任何内容

2 个答案:

答案 0 :(得分:4)

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

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的参数声明中删除了引用。这是因为迭代器通常被设计为按值传递。

答案 1 :(得分:2)

另一种选择是重载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) {}