c++ - 将可选的迭代器传递给函数

标签 c++ optional-parameters optional-arguments

是否可以为一个函数定义一个可选的迭代器,该迭代器将根据它是否存在来改变函数的行为?

给出一个具体的例子考虑定义

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 是一些表明用户不想要此输出的值。

通过定义两个单独的函数来解决这个问题,一个有边界并在定义中探索,另一个没有边界,这不是一个好的选择,因为它需要重复代码(因为函数中的逻辑是与 frontierexplored 是否存在紧密耦合。)

是否有某种模式或 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/

相关文章:

c++ - boost make_shared 的用例

java - Android Java函数参数中的 "..."和 "[]"有什么区别?

Swift:类中可选字典的变量:在输出中显示括号

php - 如何避免php函数中位置参数的缺点?

c++ - 如何创建一个 makefile 而不必在项目中包含每个源文件?

c++ - 应该将 operator<< 实现为友元还是成员函数?

python - 以字典作为可选参数的函数 - Python

python-3.x - 多个可选参数python

c++ - 来自绑定(bind)方法的原始函数指针

go - 在结构中表示可选 time.Time 的惯用方式