Summary: MSVC 2015 has issues with templated `using` declarations using `decltype`, so adjust the definition to use constexpr evaluation to fill a template parameter of a base type instead.
Reviewed By: yfeldblum
Differential Revision:
D4510155
fbshipit-source-id:
cc2e33625b515085dff4e682971299810905fef0
template <typename TTheClass_> \
struct classname##__folly_traits_impl__ { \
template <typename UTheClass_> \
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; \
+ } \
- static std::false_type test(...); \
+ static constexpr bool test(...) { \
+ return false; \
+ } \
}; \
template <typename TTheClass_> \
}; \
template <typename TTheClass_> \
- using classname = decltype( \
+ using classname = typename std::conditional< \
classname##__folly_traits_impl__<TTheClass_>::template test<TTheClass_>( \
classname##__folly_traits_impl__<TTheClass_>::template test<TTheClass_>( \
+ 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_> \
#define FOLLY_CREATE_HAS_MEMBER_FN_TRAITS_IMPL(classname, func_name, cv_qual) \
template <typename TTheClass_, typename RTheReturn_, typename... TTheArgs_> \