#include //=========================================================================== // Named Template Parameter Helper // // provides resolve_default class template // namespace boost { struct default_argument { }; namespace detail { struct dummy_default_gen { template struct bind { typedef default_argument type; }; }; } // This is a workaround for VC++ template struct default_generator { typedef detail::dummy_default_gen type; }; // Use this macro at global scope #define BOOST_NAMED_TEMPLATE_PARAMETER(NAME, DEFAULT) \ namespace boost { \ template <> struct default_generator { \ typedef DEFAULT type; \ }; \ } namespace detail { template struct is_default { enum { value = false }; }; template <> struct is_default { enum { value = true }; }; struct choose_default { template struct bind { typedef typename default_generator::type Gen; typedef typename Gen::template bind::type type; }; }; struct choose_arg { template struct bind { typedef Arg type; }; }; template struct choose_arg_or_default { typedef choose_arg type; }; template <> struct choose_arg_or_default { typedef choose_default type; }; } // namesace detail template class resolve_default { typedef typename detail::choose_arg_or_default ::value>::type Selector; public: typedef typename Selector ::template bind::type type; }; } // namespace boost //=========================================================================== // Iterator Adaptor Generator namespace boost { namespace detail { struct default_value_type { template struct bind { typedef boost::detail::iterator_traits::value_type type; }; }; struct default_difference_type { template struct bind { typedef boost::detail::iterator_traits::difference_type type; }; }; struct default_iterator_category { template struct bind { typedef boost::detail::iterator_traits::iterator_category type; }; }; struct default_pointer { template struct bind { typedef typename Traits::value_type Value; typedef typename boost::detail::iterator_defaults::pointer type; }; }; struct default_reference { template struct bind { typedef typename Traits::value_type Value; typedef typename boost::detail::iterator_defaults::reference type; }; }; } // namespace detail } // namespace boost BOOST_NAMED_TEMPLATE_PARAMETER(value_type, boost::detail::default_value_type); BOOST_NAMED_TEMPLATE_PARAMETER(reference, boost::detail::default_reference); BOOST_NAMED_TEMPLATE_PARAMETER(pointer, boost::detail::default_pointer); BOOST_NAMED_TEMPLATE_PARAMETER(difference_type, boost::detail::default_difference_type); BOOST_NAMED_TEMPLATE_PARAMETER(iterator_category, boost::detail::default_iterator_category); namespace boost { namespace detail { template struct make_iterator_adaptor_types { template struct value_type : public make_iterator_adaptor_types { }; template struct reference : public make_iterator_adaptor_types { }; template struct pointer : public make_iterator_adaptor_types { }; template struct iterator_category : public make_iterator_adaptor_types{}; template struct difference_type : public make_iterator_adaptor_types { }; typedef boost::iterator type; }; } // namespace detail struct iterator_adaptor_types : public detail::make_iterator_adaptor_types<> { }; template struct iterator_adaptor_generator { typedef typename resolve_default::type Value; typedef typename resolve_default::type Distance; typedef typename resolve_default::type Category; typedef typename Traits::pointer Pointer_; typedef typename Traits::reference Reference_; typedef boost::iterator Traits2; typedef typename resolve_default::type Reference; typedef typename resolve_default::type Pointer; typedef boost::iterator_adaptor type; }; } // namespace boost int main() { int* ptr; typedef boost::iterator_adaptor_generator ::iterator_category::type >::type Iter; Iter x(ptr); return 0; }