【发布时间】:2013-06-03 03:57:59
【问题描述】:
是否可以为函数定义一个可选的迭代器,该迭代器将根据函数的存在与否来改变函数的行为?
举个具体的例子,考虑一下定义
template<typename Graph,
typename random_access_iterator_distances,
typename random_access_iterator_predecessors,
typename back_insertor_iterator_frontier,
typename back_insertor_iterator_explored >
void dijkstra(const Graph &g,
const typename boost::graph_traits < Graph >::vertex_descriptor source,
random_access_iterator_distances distances,
random_access_iterator_predecessors predecessors,
const typename boost::graph_traits < Graph >::vertex_descriptor target = -1,
back_inserter_iterator_frontier frontier = null_iterator,
back_inserter_iterator_explored explored = null_iterator );
null_iterator 是表示用户不想要此输出的某个值。
通过定义两个单独的函数来解决这个问题,一个有边界并在定义中探索,另一个没有它,这不是一个好的选择,因为它需要重复代码(因为函数中的逻辑是与是否存在 frontier 或 explored 紧密结合。)
是否有某种模式或替换 null_iterator 以使这种类型的代码可以在 C++ 中实现?
【问题讨论】:
-
boost::optional怎么样? -
@KerrekSB:你能详细说明一下吗,这看起来是一个很有前途的解决方案?
-
好吧,把函数参数设为
boost::optional<my_iterator_type>,也许是默认的,然后函数可以检查是否传递了迭代器。
标签: c++ optional-parameters optional-arguments