boost fusion dynamic at_n

usage

  boost::fusion::vector<int,double,std::string,char> vec(9 ,2.2 ,"aaa" ,'b');
  std::cout << 
   at_n_dynamic<double>(vec, 1) 
    << std::endl; //=> 2.2

detail

#include <boost/fusion/include/vector.hpp>
//#include <boost/fusion/algorithm.hpp>

  template<typename V>
  struct fusion_at_n_functor
  {
    mutable int i;
    int n;
    mutable V value;
    fusion_at_n_functor(int _n):i(0),n(_n){}
    void operator()(const V & t) const
    { if(i==n){value=t;} i++;}  
    template<typename T>
    void operator()(const T & t) const
    { i++;}
  };

  template <typename First,typename Last,typename AtN > void
  at_n_dynamic_fusion_impl(First i,Last last,AtN &atn,boost::mpl::true_ ){}
  template <typename First,typename Last,typename AtN > void
  at_n_dynamic_fusion_impl(First i,Last last,AtN &atn,boost::mpl::false_ ){  
    if(atn.i == atn.n ){atn(boost::fusion::deref(i));}
    else{
      atn(boost::fusion::deref(i));
      at_n_dynamic_fusion_impl(boost::fusion::next(i),last,atn,
			   boost::fusion::result_of::equal_to<
			     typename boost::fusion::result_of::next<First>::type,Last>());}
  }

  template <typename Ret,typename Sequence>  Ret
  at_n_dynamic(Sequence & seq, int n){ 
    fusion_at_n_functor<Ret> atn(n);
#if 0
//debug
    boost::fusion::for_each(seq, atn);
#else
    at_n_dynamic_fusion_impl(boost::fusion::begin(seq),boost::fusion::end(seq) ,atn,
			 boost::fusion::result_of::equal_to<
			   typename boost::fusion::result_of::begin<Sequence>::type,
			   typename boost::fusion::result_of::end<Sequence>::type>());    
#endif
    return atn.value;}
///////////////////////////////////////////////
int main(){
  boost::fusion::vector<int,double,std::string,char> vec(9 ,2.2 ,"aaa" ,'b');
  std::cout << at_n_dynamic<double>(vec, 1) << std::endl; //=> 2.2
}