1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #ifndef BOOST_MATH_TOOLS_IS_DETECTED_HPP
- #define BOOST_MATH_TOOLS_IS_DETECTED_HPP
- #include <type_traits>
- namespace boost { namespace math { namespace tools {
- template <typename...>
- using void_t = void;
- namespace detail {
- template <typename Default, typename AlwaysVoid, template<typename...> class Op, typename... Args>
- struct detector
- {
- using value_t = std::false_type;
- using type = Default;
- };
- template <typename Default, template<typename...> class Op, typename... Args>
- struct detector<Default, void_t<Op<Args...>>, Op, Args...>
- {
- using value_t = std::true_type;
- using type = Op<Args...>;
- };
- }
- struct nonesuch
- {
- nonesuch() = delete;
- ~nonesuch() = delete;
- nonesuch(const nonesuch&) = delete;
- void operator=(const nonesuch&) = delete;
- };
- template <template<typename...> class Op, typename... Args>
- using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
- template <template<typename...> class Op, typename... Args>
- using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type;
- template <typename Default, template<typename...> class Op, typename... Args>
- using detected_or = detail::detector<Default, void, Op, Args...>;
- }}}
- #endif
|