Change call_traits to pass enum's by value.

Fixes #5790.

[SVN r73953]
This commit is contained in:
John Maddock 2011-08-20 16:03:58 +00:00
parent 26b39384e3
commit fe653d0a9a
2 changed files with 21 additions and 7 deletions

View File

@ -210,8 +210,10 @@ int main()
comparible_UDT u; comparible_UDT u;
c1(u); c1(u);
call_traits_checker<int> c2; call_traits_checker<int> c2;
call_traits_checker<enum_UDT> c2b;
int i = 2; int i = 2;
c2(i); c2(i);
c2b(one);
int* pi = &i; int* pi = &i;
int a[2] = {1,2}; int a[2] = {1,2};
#if defined(BOOST_MSVC6_MEMBER_TEMPLATES) && !defined(__ICL) #if defined(BOOST_MSVC6_MEMBER_TEMPLATES) && !defined(__ICL)
@ -292,7 +294,11 @@ int main()
BOOST_CHECK_TYPE(incomplete_type&, boost::call_traits<incomplete_type>::reference); BOOST_CHECK_TYPE(incomplete_type&, boost::call_traits<incomplete_type>::reference);
BOOST_CHECK_TYPE(const incomplete_type&, boost::call_traits<incomplete_type>::const_reference); BOOST_CHECK_TYPE(const incomplete_type&, boost::call_traits<incomplete_type>::const_reference);
BOOST_CHECK_TYPE(const incomplete_type&, boost::call_traits<incomplete_type>::param_type); BOOST_CHECK_TYPE(const incomplete_type&, boost::call_traits<incomplete_type>::param_type);
// test enum:
BOOST_CHECK_TYPE(enum_UDT, boost::call_traits<enum_UDT>::value_type);
BOOST_CHECK_TYPE(enum_UDT&, boost::call_traits<enum_UDT>::reference);
BOOST_CHECK_TYPE(const enum_UDT&, boost::call_traits<enum_UDT>::const_reference);
BOOST_CHECK_TYPE(const enum_UDT, boost::call_traits<enum_UDT>::param_type);
return 0; return 0;
} }

View File

@ -24,6 +24,7 @@
#include <cstddef> #include <cstddef>
#include <boost/type_traits/is_arithmetic.hpp> #include <boost/type_traits/is_arithmetic.hpp>
#include <boost/type_traits/is_enum.hpp>
#include <boost/type_traits/is_pointer.hpp> #include <boost/type_traits/is_pointer.hpp>
#include <boost/detail/workaround.hpp> #include <boost/detail/workaround.hpp>
@ -43,20 +44,26 @@ struct ct_imp2<T, true>
typedef const T param_type; typedef const T param_type;
}; };
template <typename T, bool isp, bool b1> template <typename T, bool isp, bool b1, bool b2>
struct ct_imp struct ct_imp
{ {
typedef const T& param_type; typedef const T& param_type;
}; };
template <typename T, bool isp> template <typename T, bool isp, bool b2>
struct ct_imp<T, isp, true> struct ct_imp<T, isp, true, b2>
{ {
typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type; typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
}; };
template <typename T, bool b1> template <typename T, bool isp, bool b1>
struct ct_imp<T, true, b1> struct ct_imp<T, isp, b1, true>
{
typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
};
template <typename T, bool b1, bool b2>
struct ct_imp<T, true, b1, b2>
{ {
typedef const T param_type; typedef const T param_type;
}; };
@ -79,7 +86,8 @@ public:
typedef typename boost::detail::ct_imp< typedef typename boost::detail::ct_imp<
T, T,
::boost::is_pointer<T>::value, ::boost::is_pointer<T>::value,
::boost::is_arithmetic<T>::value ::boost::is_arithmetic<T>::value,
::boost::is_enum<T>::value
>::param_type param_type; >::param_type param_type;
}; };