function object研究之九 visit_each

先看一下boost::visit_each模板,定义在visit_each.hpp文件中

namespace boost {
  template<typename Visitor, typename T>
  inline void visit_each(Visitor& visitor, const T& t, long)
  {
    visitor(t);
  }

  template<typename Visitor, typename T>
  inline void visit_each(Visitor& visitor, const T& t)
  {
    visit_each(visitor, t, 0);
  }
}

这提供了一个简单的机制, constT& t 参数是被观察的对象, Visitor& visitor 参数是用来观察t的function object,因此必须实现operator()()函数,然后在visist_each内部会被调用:

visitor(t)

第三个参数long将来会被废除,目前只能传0.


下面有个简单的例子:

struct A {
    A():y(3), z(5) {
        
    }
    
    int y;
    
    int z;
};

template<class T>
struct Visitor {
    void operator()(T const& t) {
        cout << t.y << endl;
        cout << t.z << endl;
    }
};
int main(int argc, char** argv) {
    A b;
    Visitor<A> v;
    visit_each(v, b, 0);
    return 0;
}
运行结果:

3
5


马上就有个问题,为什么要这个visit_each?这应该是Visitor设计模式的C++模板的实现。不要设计Visitor接口和具体的子类,使用者只要设计自己的类以及访问该类的visitor function object就可以了。

经典Visitor设计模式可以参考这里的一篇博客:http://blog.csdn.net/superbeck/article/details/5325991






你可能感兴趣的:(function object研究之九 visit_each)