template <typename TTheClass_> \
struct classname##__folly_traits_impl__ { \
template <typename UTheClass_> \
- static std::true_type test(typename UTheClass_::type_name*); \
+ static constexpr bool test(typename UTheClass_::type_name*) { \
+ return true; \
+ } \
template <typename> \
- static std::false_type test(...); \
+ static constexpr bool test(...) { \
+ return false; \
+ } \
}; \
template <typename TTheClass_> \
- using classname = decltype( \
+ using classname = typename std::conditional< \
classname##__folly_traits_impl__<TTheClass_>::template test<TTheClass_>( \
- nullptr))
+ nullptr), \
+ std::true_type, \
+ std::false_type>::type;
#define FOLLY_CREATE_HAS_MEMBER_FN_TRAITS_IMPL(classname, func_name, cv_qual) \
template <typename TTheClass_, typename RTheReturn_, typename... TTheArgs_> \
// Lighter-weight than Conjunction, but evaluates all sub-conditions eagerly.
template <class... Ts>
-using StrictConjunction =
- std::is_same<Bools<Ts::value..., true>, Bools<true, Ts::value...>>;
+struct StrictConjunction
+ : std::is_same<Bools<Ts::value..., true>, Bools<true, Ts::value...>> {};
} // namespace folly
// types) that violate -Wsign-compare and/or -Wbool-compare so suppress them
// in order to not prevent all calling code from using it.
FOLLY_PUSH_WARNING
-FOLLY_GCC_DISABLE_WARNING(sign-compare)
+FOLLY_GCC_DISABLE_WARNING("-Wsign-compare")
#if __GNUC_PREREQ(5, 0)
-FOLLY_GCC_DISABLE_WARNING(bool-compare)
+FOLLY_GCC_DISABLE_WARNING("-Wbool-compare")
#endif
FOLLY_MSVC_DISABLE_WARNING(4388) // sign-compare
FOLLY_MSVC_DISABLE_WARNING(4804) // bool-compare