是否可以为一个函数定义一个可选的迭代器,该迭代器将根据它是否存在来改变函数的行为?
给出一个具体的例子考虑定义
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++ 中实现?
最佳答案
最简单的解决方案是编写一个简单的 DevNullIterator。由于它的 operator*
不执行任何操作,因此它被简单地内联并编译掉。
struct DevNull {
template<typename T> operator=(T const&) { }
template<typename T> operator T&() { static T dummy; return dummy; }
};
struct DevNullIterator {
DevNull operator*() const { return DevNull();}
DevNullIterator operator++() const { return *this; }
};
关于c++ - 将可选的迭代器传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16974014/