| 
									
										
										
										
											2004-07-25 03:57:20 +00:00
										 |  |  | // Boost result_of library
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  Copyright Douglas Gregor 2003-2004. Use, modification and
 | 
					
						
							|  |  |  | //  distribution is subject to the Boost Software License, Version
 | 
					
						
							|  |  |  | //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
 | 
					
						
							|  |  |  | //  http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-11 00:28:33 +00:00
										 |  |  | #include <boost/config.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-25 03:57:20 +00:00
										 |  |  | // For more information, see http://www.boost.org/libs/utility
 | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | #include <boost/utility/result_of.hpp>
 | 
					
						
							|  |  |  | #include <utility>
 | 
					
						
							|  |  |  | #include <boost/static_assert.hpp>
 | 
					
						
							|  |  |  | #include <boost/type_traits/is_same.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | struct int_result_type | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   typedef int result_type; | 
					
						
							|  |  |  |   result_type operator()(float); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct int_result_of | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   template<typename F> struct result { typedef int type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   result<int_result_of(double)>::type operator()(double); | 
					
						
							|  |  |  |   result<const int_result_of(double)>::type operator()(double) const; | 
					
						
							|  |  |  |   result<int_result_of()>::type operator()(); | 
					
						
							|  |  |  |   result<volatile int_result_of()>::type operator()() volatile; | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | struct int_result_type_and_float_result_of_and_char_return | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   typedef int result_type; | 
					
						
							|  |  |  |   template<typename F> struct result { typedef float type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   char operator()(char); | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  | template<typename T> | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | struct int_result_type_template | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   typedef int result_type; | 
					
						
							|  |  |  |   result_type operator()(float); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | template<typename T> | 
					
						
							|  |  |  | struct int_result_of_template | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   template<typename F> struct result; | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That)> { typedef int type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   typename result<int_result_of_template<T>(double)>::type operator()(double); | 
					
						
							|  |  |  |   typename result<const int_result_of_template<T>(double)>::type operator()(double) const; | 
					
						
							|  |  |  |   typename result<int_result_of_template<T>(double)>::type operator()(); | 
					
						
							|  |  |  |   typename result<volatile int_result_of_template<T>(double)>::type operator()() volatile; | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<typename T> | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | struct int_result_type_and_float_result_of_and_char_return_template | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   typedef int result_type; | 
					
						
							|  |  |  |   template<typename F> struct result; | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That)> { typedef float type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   char operator()(char); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  | template<typename T> | 
					
						
							|  |  |  | struct cv_overload_check {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | struct result_of_member_function_template | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   template<typename F> struct result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That)> { typedef That type; }; | 
					
						
							|  |  |  |   template<class T> typename result<result_of_member_function_template(T)>::type operator()(T); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   template<typename This, typename That> struct result<const This(That)> { typedef cv_overload_check<const That> type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   template<class T> typename result<const result_of_member_function_template(T)>::type operator()(T) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   template<typename This, typename That> struct result<volatile This(That)> { typedef cv_overload_check<volatile That> type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   template<class T> typename result<volatile result_of_member_function_template(T)>::type operator()(T) volatile; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   template<typename This, typename That> struct result<const volatile This(That)> { typedef cv_overload_check<const volatile That> type; }; | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   template<class T> typename result<const volatile result_of_member_function_template(T)>::type operator()(T) const volatile; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That &, That)> { typedef That & type; }; | 
					
						
							|  |  |  |   template<class T> typename result<result_of_member_function_template(T &, T)>::type operator()(T &, T); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That const &, That)> { typedef That const & type; }; | 
					
						
							|  |  |  |   template<class T> typename result<result_of_member_function_template(T const &, T)>::type operator()(T const &, T); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That volatile &, That)> { typedef That volatile & type; }; | 
					
						
							|  |  |  |   template<class T> typename result<result_of_member_function_template(T volatile &, T)>::type operator()(T volatile &, T); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<typename This, typename That> struct result<This(That const volatile &, That)> { typedef That const volatile & type; }; | 
					
						
							|  |  |  |   template<class T> typename result<result_of_member_function_template(T const volatile &, T)>::type operator()(T const volatile &, T); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  | struct no_result_type_or_result | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   short operator()(double); | 
					
						
							|  |  |  |   cv_overload_check<const short> operator()(double) const; | 
					
						
							|  |  |  |   cv_overload_check<volatile short> operator()(double) volatile; | 
					
						
							|  |  |  |   cv_overload_check<const volatile short> operator()(double) const volatile; | 
					
						
							|  |  |  |   int operator()(); | 
					
						
							|  |  |  |   cv_overload_check<const int> operator()() const; | 
					
						
							|  |  |  |   cv_overload_check<volatile int> operator()() volatile; | 
					
						
							|  |  |  |   cv_overload_check<const volatile int> operator()() const volatile; | 
					
						
							| 
									
										
										
										
											2011-01-22 22:18:48 +00:00
										 |  |  | #if !defined(BOOST_NO_RVALUE_REFERENCES)
 | 
					
						
							|  |  |  |   short operator()(int&&); | 
					
						
							|  |  |  |   int operator()(int&); | 
					
						
							|  |  |  |   long operator()(int const&); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<typename T> | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  | struct no_result_type_or_result_template | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   short operator()(double); | 
					
						
							|  |  |  |   cv_overload_check<const short> operator()(double) const; | 
					
						
							|  |  |  |   cv_overload_check<volatile short> operator()(double) volatile; | 
					
						
							|  |  |  |   cv_overload_check<const volatile short> operator()(double) const volatile; | 
					
						
							|  |  |  |   int operator()(); | 
					
						
							|  |  |  |   cv_overload_check<const int> operator()() const; | 
					
						
							|  |  |  |   cv_overload_check<volatile int> operator()() volatile; | 
					
						
							|  |  |  |   cv_overload_check<const volatile int> operator()() const volatile; | 
					
						
							| 
									
										
										
										
											2011-01-22 22:18:48 +00:00
										 |  |  | #if !defined(BOOST_NO_RVALUE_REFERENCES)
 | 
					
						
							|  |  |  |   short operator()(int&&); | 
					
						
							|  |  |  |   int operator()(int&); | 
					
						
							|  |  |  |   long operator()(int const&); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-19 23:10:08 +00:00
										 |  |  | // sfinae_tests are derived from example code from Joel de Guzman,
 | 
					
						
							|  |  |  | // which demonstrated the interaction between result_of and SFINAE.
 | 
					
						
							|  |  |  | template <typename F, typename Arg> | 
					
						
							|  |  |  | typename boost::result_of<F(Arg const&)>::type | 
					
						
							|  |  |  | sfinae_test(F f, Arg const& arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return f(arg); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <typename F, typename Arg> | 
					
						
							|  |  |  | typename boost::result_of<F(Arg&)>::type | 
					
						
							|  |  |  | sfinae_test(F f, Arg& arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return f(arg); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int sfinae_test_f(int& i) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return i; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | struct X {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   using namespace boost; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   typedef int (*func_ptr)(float, double); | 
					
						
							|  |  |  |   typedef int (&func_ref)(float, double); | 
					
						
							| 
									
										
										
										
											2007-01-24 06:44:20 +00:00
										 |  |  |   typedef int (*func_ptr_0)(); | 
					
						
							|  |  |  |   typedef int (&func_ref_0)(); | 
					
						
							| 
									
										
										
										
											2012-09-23 02:08:32 +00:00
										 |  |  |   typedef void (*func_ptr_void)(float, double); | 
					
						
							|  |  |  |   typedef void (&func_ref_void)(float, double); | 
					
						
							|  |  |  |   typedef void (*func_ptr_void_0)(); | 
					
						
							|  |  |  |   typedef void (&func_ref_void_0)(); | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  |   typedef int (X::*mem_func_ptr)(float); | 
					
						
							|  |  |  |   typedef int (X::*mem_func_ptr_c)(float) const; | 
					
						
							|  |  |  |   typedef int (X::*mem_func_ptr_v)(float) volatile; | 
					
						
							|  |  |  |   typedef int (X::*mem_func_ptr_cv)(float) const volatile; | 
					
						
							| 
									
										
										
										
											2007-01-24 06:44:20 +00:00
										 |  |  |   typedef int (X::*mem_func_ptr_0)(); | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type(float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(double)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of(double)>::type, int>::value)); | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_template<void>(float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(double)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of_template<void>(double)>::type, int>::value)); | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_type(float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_of(double)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<const int_result_of(double)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_type_template<void>(float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_of_template<void>(double)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<const int_result_of_template<void>(double)>::type, int>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_of(void)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<volatile int_result_of(void)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_of_template<void>(void)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<volatile int_result_of_template<void>(void)>::type, void>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   // Prior to decltype, result_of could not deduce the return type
 | 
					
						
							|  |  |  |   // nullary function objects unless they exposed a result_type.
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  | #if defined(BOOST_RESULT_OF_USE_DECLTYPE)
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(void)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of(void)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(void)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of_template<void>(void)>::type, int>::value)); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(void)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of(void)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(void)>::type, void>::value)); | 
					
						
							| 
									
										
										
										
											2007-01-08 20:38:51 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of_template<void>(void)>::type, void>::value)); | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Prior to decltype, result_of ignored a nested result<> if
 | 
					
						
							|  |  |  |   // result_type was defined. After decltype, result_of deduces the
 | 
					
						
							|  |  |  |   // actual return type of the function object, ignoring both
 | 
					
						
							|  |  |  |   // result<> and result_type.
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  | #if defined(BOOST_RESULT_OF_USE_DECLTYPE)
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, char>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, char>::value)); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, int>::value)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, int>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr(char, float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ref(char, float)>::type, int>::value)); | 
					
						
							| 
									
										
										
										
											2007-01-24 06:44:20 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr_0()>::type, int>::value));  | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ref_0()>::type, int>::value));  | 
					
						
							| 
									
										
										
										
											2012-09-23 02:08:32 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr_void(char, float)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ref_void(char, float)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr_void_0()>::type, void>::value));  | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<func_ref_void_0()>::type, void>::value));  | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_c(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_v(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_cv(X,char)>::type, int>::value)); | 
					
						
							| 
									
										
										
										
											2007-01-24 06:44:20 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_0(X)>::type, int>::value));  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ptr(char, float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ref(char, float)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ptr_0()>::type, int>::value));  | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ref_0()>::type, int>::value));  | 
					
						
							| 
									
										
										
										
											2012-09-23 02:08:32 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ptr_void(char, float)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ref_void(char, float)>::type, void>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ptr_void_0()>::type, void>::value));  | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ref_void_0()>::type, void>::value));  | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<mem_func_ptr(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<mem_func_ptr_c(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<mem_func_ptr_v(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<mem_func_ptr_cv(X,char)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<mem_func_ptr_0(X)>::type, int>::value));  | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ptr(void)>::type, int>::value)); | 
					
						
							| 
									
										
										
										
											2012-04-01 20:38:36 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<func_ref(void)>::type, int>::value)); | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(double)>::type, double>::value)); | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const result_of_member_function_template(double)>::type, cv_overload_check<const double> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile result_of_member_function_template(double)>::type, cv_overload_check<volatile double> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const volatile result_of_member_function_template(double)>::type, cv_overload_check<const volatile double> >::value)); | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int &, int)>::type, int &>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int const &, int)>::type, int const &>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int volatile &, int)>::type, int volatile &>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int const volatile &, int)>::type, int const volatile &>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(double)>::type, double>::value)); | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<const result_of_member_function_template(double)>::type, cv_overload_check<const double> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<volatile result_of_member_function_template(double)>::type, cv_overload_check<volatile double> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<const volatile result_of_member_function_template(double)>::type, cv_overload_check<const volatile double> >::value)); | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(int &, int)>::type, int &>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(int const &, int)>::type, int const &>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(int volatile &, int)>::type, int volatile &>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(int const volatile &, int)>::type, int const volatile &>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-05 19:58:30 +00:00
										 |  |  |   typedef int (*pf_t)(int); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<pf_t(int)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<pf_t const(int)>::type,int>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-13 15:01:11 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<pf_t(int)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<tr1_result_of<pf_t const(int)>::type,int>::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  | #if defined(BOOST_RESULT_OF_USE_DECLTYPE)
 | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result(double)>::type, short>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result(double)>::type, cv_overload_check<const short> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result(double)>::type, cv_overload_check<volatile short> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result(double)>::type, cv_overload_check<const volatile short> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result(void)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result(void)>::type, cv_overload_check<const int> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result(void)>::type, cv_overload_check<volatile int> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result(void)>::type, cv_overload_check<const volatile int> >::value)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_template<void>(double)>::type, short>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result_template<void>(double)>::type, cv_overload_check<const short> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result_template<void>(double)>::type, cv_overload_check<volatile short> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result_template<void>(double)>::type, cv_overload_check<const volatile short> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_template<void>(void)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result_template<void>(void)>::type, cv_overload_check<const int> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result_template<void>(void)>::type, cv_overload_check<volatile int> >::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result_template<void>(void)>::type, cv_overload_check<const volatile int> >::value)); | 
					
						
							| 
									
										
										
										
											2011-01-22 22:18:48 +00:00
										 |  |  | #if !defined(BOOST_NO_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2012-09-01 20:00:33 +00:00
										 |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result(int&&)>::type, short>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result(int&)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result(int const&)>::type, long>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_template<void>(int&&)>::type, short>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_template<void>(int&)>::type, int>::value)); | 
					
						
							|  |  |  |   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_template<void>(int const&)>::type, long>::value)); | 
					
						
							| 
									
										
										
										
											2011-01-22 22:18:48 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-05-09 22:08:46 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-19 23:10:08 +00:00
										 |  |  | #if defined(BOOST_RESULT_OF_USE_DECLTYPE)
 | 
					
						
							|  |  |  |   int i = 123; | 
					
						
							|  |  |  |   sfinae_test(sfinae_test_f, i); | 
					
						
							|  |  |  | #endif // defined(BOOST_RESULT_OF_USE_DECLTYPE)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-05-02 19:55:02 +00:00
										 |  |  |   return 0; | 
					
						
							|  |  |  | } |