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 }