#include #include # if !defined(BOOST_MSVC) # define BOOST_ARG_DEPENDENT_TYPENAME typename # else # define BOOST_ARG_DEPENDENT_TYPENAME # endif namespace boost { namespace detail { struct no_default_parameter { }; struct default_policies { }; struct default_value { }; struct default_pointer { }; struct default_reference { }; struct default_distance { }; struct default_category { }; template struct get_default { template struct bind { typedef Param type; }; }; #define SET_DEFAULT(KEY) \ template <> struct get_default { \ template \ struct bind { typedef #define DEFAULT_END type; }; } #define gentype bind::type SET_DEFAULT(default_policies) default_iterator_policies DEFAULT_END; SET_DEFAULT(default_value) typename boost::detail::iterator_traits::value_type DEFAULT_END; SET_DEFAULT(default_pointer) typename boost::detail::iterator_defaults::pointer DEFAULT_END; SET_DEFAULT(default_distance) typename boost::detail::iterator_traits::difference_type DEFAULT_END; SET_DEFAULT(default_category) typename boost::detail::iterator_traits::iterator_category DEFAULT_END; SET_DEFAULT(default_reference) typename boost::detail::iterator_defaults::reference DEFAULT_END; template <> struct get_default { }; #define GET_DEFAULT(KEY) \ typename get_default::template bind::type template struct generate_iter_adaptor { }; template <> struct generate_iter_adaptor { template struct bind { typedef iterator_adaptor< GET_DEFAULT(Base), GET_DEFAULT(Policies), GET_DEFAULT(Value), GET_DEFAULT(Reference), GET_DEFAULT(Category), GET_DEFAULT(Distance), GET_DEFAULT(Pointer) > type; }; }; template struct iterator_adaptor_types { template struct end { typedef typename generate_iter_adaptor:: template bind ::type type; }; template struct base : iterator_adaptor_types { }; template struct policies : iterator_adaptor_types { }; template struct value : iterator_adaptor_types { }; template struct reference : iterator_adaptor_types { }; template struct pointer : iterator_adaptor_types { }; template struct category : iterator_adaptor_types { }; template struct distance : iterator_adaptor_types { }; }; } // namespace detail struct iterator_adaptor_generator : public detail::iterator_adaptor_types<> { }; } // namespace boost int main() { int* x; boost::iterator_adaptor_generator ::base ::reference ::policies ::end<>::type iter(x); return 0; }