函数中输出容器默认值的开始
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
)的begin
和end
是必须的。但是,输出容器(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) {}
我有以下减速功能:
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
)的begin
和end
是必须的。但是,输出容器(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
.
如果这样调用:
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) {}