diff --git a/include/boost/detail/named_template_params.hpp b/include/boost/detail/named_template_params.hpp index 6288a30..eda8524 100644 --- a/include/boost/detail/named_template_params.hpp +++ b/include/boost/detail/named_template_params.hpp @@ -8,6 +8,9 @@ #define BOOST_DETAIL_NAMED_TEMPLATE_PARAMS_HPP #include +#if defined(__BORLANDC__) +#include +#endif namespace boost { namespace detail { @@ -26,8 +29,14 @@ namespace boost { typedef detail::dummy_default_gen type; }; - template struct is_default { enum { value = false }; }; - template <> struct is_default { enum { value = true }; }; + template struct is_default { + enum { value = false }; + typedef type_traits::no_type type; + }; + template <> struct is_default { + enum { value = true }; + typedef type_traits::yes_type type; + }; struct choose_default { template @@ -42,17 +51,33 @@ namespace boost { typedef Arg type; }; }; + +#if defined(__BORLANDC__) + template + struct choose_arg_or_default { typedef choose_arg type; }; + template <> + struct choose_arg_or_default { + typedef choose_default type; + }; +#else template struct choose_arg_or_default { typedef choose_arg type; }; template <> struct choose_arg_or_default { typedef choose_default type; }; +#endif template class resolve_default { +#if defined(__BORLANDC__) + typedef typename choose_arg_or_default::type>::type Selector; +#else + // This usually works for Borland, but I'm seeing weird errors in + // iterator_adaptor_test.cpp when using this method. enum { is_def = is_default::value }; typedef typename choose_arg_or_default::type Selector; +#endif public: typedef typename Selector ::template bind::type type; @@ -75,6 +100,7 @@ namespace boost { typedef detail::default_argument type; }; }; + template struct choose_default_dispatch { }; template <> struct choose_default_dispatch { typedef choose_named_params type; @@ -83,6 +109,7 @@ namespace boost { typedef choose_default_arg type; }; + template struct choose_default_argument { enum { is_named = is_named_param_list::value };