1 // Copyright David Abrahams 2006. Distributed under the Boost 2 // Software License, Version 1.0. (See accompanying 3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 4 #ifndef BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP 5 # define BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP 6 7 # include <boost/type_traits/integral_constant.hpp> 8 # include <boost/config/workaround.hpp> 9 # include <boost/concept/detail/backward_compatibility.hpp> 10 11 namespace boost { namespace concepts { 12 13 namespace detail 14 { 15 16 // Here we implement the metafunction that detects whether a 17 // constraints metafunction exists 18 typedef char yes; 19 typedef char (&no)[2]; 20 21 template <class Model, void (Model::*)()> 22 struct wrap_constraints {}; 23 24 #if BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580) || defined(__CUDACC__) 25 // Work around the following bogus error in Sun Studio 11, by 26 // turning off the has_constraints function entirely: 27 // Error: complex expression not allowed in dependent template 28 // argument expression 29 inline no has_constraints_(...); 30 #else 31 template <class Model> 32 inline yes has_constraints_(Model*, wrap_constraints<Model,&Model::constraints>* = 0); 33 inline no has_constraints_(...); 34 #endif 35 } 36 37 // This would be called "detail::has_constraints," but it has a strong 38 // tendency to show up in error messages. 39 template <class Model> 40 struct not_satisfied 41 { 42 BOOST_STATIC_CONSTANT( 43 bool 44 , value = sizeof( detail::has_constraints_((Model*)0) ) == sizeof(detail::yes) ); 45 typedef boost::integral_constant<bool, value> type; 46 }; 47 48 }} // namespace boost::concepts::detail 49 50 #endif // BOOST_CONCEPT_DETAIL_HAS_CONSTRAINTS_DWA2006429_HPP 51