37 # pragma GCC system_header
38 #elif defined(BOOST_MSVC)
39 # pragma warning ( push )
40 # pragma warning ( disable : 4018 4244 4547 4800 4804 4805 4913)
41 # if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
42 # pragma warning ( disable : 6334)
54 template <
typename T>
T &make();
62 struct no_operator { };
67 struct any {
template <
class T>
any(
T const&); };
82 struct returns_void_t { };
83 template <
typename T>
int operator,(
const T&, returns_void_t);
84 template <
typename T>
int operator,(
const volatile T&, returns_void_t);
89 template <
typename Lhs,
typename Rhs >
90 struct operator_returns_void {
94 static ::boost::type_traits::no_type returns_void(
int);
102 struct dont_care { };
104 template <
typename Lhs,
typename Rhs,
typename Ret,
bool Returns_
void >
105 struct operator_returns_Ret;
107 template <
typename Lhs,
typename Rhs >
108 struct operator_returns_Ret < Lhs, Rhs, dont_care, true > {
112 template <
typename Lhs,
typename Rhs >
113 struct operator_returns_Ret < Lhs, Rhs, dont_care, false > {
117 template <
typename Lhs,
typename Rhs >
118 struct operator_returns_Ret < Lhs, Rhs, void, true > {
122 template <
typename Lhs,
typename Rhs >
123 struct operator_returns_Ret < Lhs, Rhs, void, false > {
127 template <
typename Lhs,
typename Rhs,
typename Ret >
128 struct operator_returns_Ret < Lhs, Rhs, Ret, true > {
135 template <
typename Lhs,
typename Rhs,
typename Ret >
136 struct operator_returns_Ret < Lhs, Rhs, Ret, false > {
138 static ::boost::type_traits::no_type is_convertible_to_Ret(...);
150 struct has_operator { };
151 no_operator operator,(no_operator, has_operator);
153 template <
typename Lhs,
typename Rhs >
154 struct operator_exists {
156 static ::boost::type_traits::no_type s_check(no_operator);
169 template <
typename Lhs,
typename Rhs,
typename Ret,
bool Forb
idden_if >
172 template <
typename Lhs,
typename Rhs,
typename Ret >
173 struct trait_impl1 < Lhs, Rhs, Ret, true > {
177 template <
typename Lhs,
typename Rhs,
typename Ret >
178 struct trait_impl1 < Lhs, Rhs, Ret, false > {
180 value = (operator_exists < Lhs, Rhs >::value && operator_returns_Ret < Lhs, Rhs, Ret, operator_returns_void < Lhs, Rhs >::value >::value));
184 template <
typename Rhs,
typename Ret >
185 struct trait_impl1 < void, Rhs, Ret, false > {
189 template <
typename Lhs,
typename Ret >
190 struct trait_impl1 < Lhs, void, Ret, false > {
194 template <
typename Ret >
195 struct trait_impl1 < void, void, Ret, false > {
200 template <
typename Lhs,
typename Rhs,
typename Ret >
202 typedef typename ::boost::remove_reference<Lhs>::type Lhs_noref;
203 typedef typename ::boost::remove_reference<Rhs>::type Rhs_noref;
204 typedef typename ::boost::remove_cv<Lhs_noref>::type Lhs_nocv;
205 typedef typename ::boost::remove_cv<Rhs_noref>::type Rhs_nocv;
206 typedef typename ::boost::remove_cv< typename ::boost::remove_reference< typename ::boost::remove_pointer<Lhs_noref>::type >
::type >
::type Lhs_noptr;
207 typedef typename ::boost::remove_cv< typename ::boost::remove_reference< typename ::boost::remove_pointer<Rhs_noref>::type >
::type >
::type Rhs_noptr;
208 BOOST_STATIC_CONSTANT(
bool, value = (trait_impl1 < Lhs_noref, Rhs_noref, Ret, BOOST_TT_FORBIDDEN_IF >::value));
215 template <
class Lhs,
class Rhs=Lhs,
class Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care>
220 #if defined(BOOST_MSVC)
221 # pragma warning ( pop )