1212# include < boost/type_traits/is_class.hpp>
1313# include < boost/type_traits/is_const.hpp>
1414# include < boost/type_traits/is_volatile.hpp>
15+ # include < boost/type_traits/is_member_function_pointer.hpp>
1516# include < boost/type_traits/remove_cv.hpp>
1617# include < boost/type_traits/remove_reference.hpp>
1718# include < boost/type_traits/remove_pointer.hpp>
@@ -69,6 +70,25 @@ struct is_pointer_to_function<T*> : is_function<T>
6970{
7071};
7172
73+ template <class T >
74+ struct is_reference_to_member_function_pointer_impl : mpl::bool_c<false >
75+ {
76+ };
77+
78+ template <class T >
79+ struct is_reference_to_member_function_pointer_impl <T&>
80+ : is_member_function_pointer<typename remove_cv<T>::type>
81+ {
82+ };
83+
84+
85+ template <class T >
86+ struct is_reference_to_member_function_pointer
87+ : is_reference_to_member_function_pointer_impl<T>
88+ {
89+ BOOST_MPL_AUX_LAMBDA_SUPPORT (1 ,is_reference_to_member_function_pointer,(T))
90+ };
91+
7292template <class T >
7393struct is_reference_to_function_pointer_aux
7494{
@@ -85,7 +105,11 @@ struct is_reference_to_function_pointer_aux
85105
86106template <class T >
87107struct is_reference_to_function_pointer
88- : mpl::if_c<is_reference_to_function<T>::value, mpl::bool_c<false >, is_reference_to_function_pointer_aux<T> >::type
108+ : mpl::if_c<
109+ is_reference_to_function<T>::value
110+ , mpl::bool_c<false >
111+ , is_reference_to_function_pointer_aux<T>
112+ >::type
89113{
90114};
91115
@@ -372,18 +396,52 @@ struct is_reference_to_pointer
372396 BOOST_STATIC_CONSTANT (
373397 bool , value
374398 = (is_reference<T>::value
375- && sizeof (reference_to_pointer_helper(t)) == sizeof (inner_yes_type))
399+ && sizeof (( reference_to_pointer_helper) (t)) == sizeof (inner_yes_type))
376400 );
377401};
378402
379403template <class T >
380404struct is_reference_to_function_pointer
381- : mpl::if_<is_reference<T>
382- , is_pointer_to_function_aux<T>, mpl::bool_c<false > >::type
405+ : mpl::if_<
406+ is_reference<T>
407+ , is_pointer_to_function_aux<T>
408+ , mpl::bool_c<false >
409+ >::type
383410{
384411 BOOST_MPL_AUX_LAMBDA_SUPPORT (1 ,is_reference_to_function_pointer,(T))
385412};
386413
414+
415+ template <class T >
416+ struct is_member_function_pointer_help
417+ : mpl::if_<is_member_function_pointer<T>, inner_yes_type, inner_no_type>
418+ {};
419+
420+ template <typename V>
421+ typename is_member_function_pointer_help<V>::type member_function_pointer_helper (V&);
422+ outer_no_type member_function_pointer_helper (...);
423+
424+ template <class T >
425+ struct is_pointer_to_member_function_aux
426+ {
427+ static T t;
428+ BOOST_STATIC_CONSTANT (
429+ bool , value
430+ = sizeof ((member_function_pointer_helper)(t)) == sizeof (inner_yes_type));
431+ typedef mpl::bool_c<value> type;
432+ };
433+
434+ template <class T >
435+ struct is_reference_to_member_function_pointer
436+ : mpl::if_<
437+ is_reference<T>
438+ , is_pointer_to_member_function_aux<T>
439+ , mpl::bool_c<false >
440+ >::type
441+ {
442+ BOOST_MPL_AUX_LAMBDA_SUPPORT (1 ,is_reference_to_member_function_pointer,(T))
443+ };
444+
387445template <typename V>
388446typename is_class_help<V>::type reference_to_class_helper (V const volatile &);
389447outer_no_type reference_to_class_helper (...);
0 commit comments