Created
February 3, 2016 05:15
-
-
Save milesrout/1a824757e2cbc08550ef to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace std { | |
template< class... > | |
using void_t = void; | |
namespace experimental { | |
struct nonesuch { | |
nonesuch() = delete; | |
~nonesuch() = delete; | |
nonesuch(nonesuch const&) = delete; | |
void operator=(nonesuch const&) = delete; | |
}; | |
namespace detail { | |
template <class Default, class AlwaysVoid, | |
template<class...> class Op, class... Args> | |
struct detector { | |
using value_t = std::false_type; | |
using type = Default; | |
}; | |
template <class Default, template<class...> class Op, class... Args> | |
struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> { | |
// Note that std::void_t is a C++17 feature | |
using value_t = std::true_type; | |
using type = Op<Args...>; | |
}; | |
} // namespace detail | |
template <template<class...> class Op, class... Args> | |
using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t; | |
template <template<class...> class Op, class... Args> | |
using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type; | |
template <class Default, template<class...> class Op, class... Args> | |
using detected_or = detail::detector<Default, void, Op, Args...>; | |
template< template<class...> class Op, class... Args > | |
constexpr bool is_detected_v = is_detected<Op, Args...>::value; | |
template< class Default, template<class...> class Op, class... Args > | |
using detected_or_t = typename detected_or<Default, Op, Args...>::type; | |
template <class Expected, template<class...> class Op, class... Args> | |
using is_detected_exact = is_same<Expected, detected_t<Op, Args...>>; | |
template <class Expected, template<class...> class Op, class... Args> | |
constexpr bool is_detected_exact_v = is_detected_exact<Expected, Op, Args...>::value; | |
template <class To, template<class...> class Op, class... Args> | |
using is_detected_convertible = is_convertible<detected_t<Op, Args...>, To>; | |
template <class To, template<class...> class Op, class... Args> | |
constexpr bool is_detected_convertible_v = is_detected_convertible<To, Op, Args...>::value; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment