我的功能有以下减速度:
template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input, const Tinput_iterator& end_input, Toutput_iterator& begin_output);
数据容器begin
和end
(begin_input
&amp; end_input
)是强制性的。但是,输出容器begin
(end_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
并且不会存储任何内容
答案 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) {}