#include #include #include #include #include #include #include #include namespace bm = boost::mpl; namespace test { template class circ_sequence { private: struct beg{}; struct end{}; typedef typename bm::begin::type sequence_beg_type; typedef typename bm::end::type sequence_end_type; typedef typename bm::push_front::type sequence_beg; typedef typename bm::push_back::type sequence_appended; typedef typename bm::index_of< sequence_appended, type >::type position; typedef typename bm::at_c< sequence_appended, position::value+1 >::type next_type_temp; public: typedef typename type this_type; typedef typename bm::if_< boost::is_same< next_type_temp, end >, sequence_beg_type, next_type_temp >::type next_type; }; class holder { public: typedef boost::variant types; typedef bm::vector sequence; struct print_next_type: public boost::static_visitor { template types operator() (const T& t) const { typedef circ_sequence< sequence, T >::next_type nextFails; typedef circ_sequence< sequence, double>::next_type nextWorks; if( boost::is_same< T, double>::value ) std::cerr << "Same type" << "\n"; if( boost::is_same< nextFails, nextWorks>::value ) std::cerr << "Same type" << "\n"; nextWorks works; types n(works); //nextFails fails; //types n1(fails); return n; } }; holder(const types& t): _t(t) { std::cerr << boost::apply_visitor( print_next_type(), _t ); } types _t; }; }; using namespace test; int main(int argc, char *argv[]) { double a = 10.0; holder hol(a); holder::types t((std::string)"name"); return 0; }