Checks if Op<Args...> is a valid expression without evaluating it.
#ifndef __utl_meta_detection_h__
#define __utl_meta_detection_h__
#include <type_traits>
namespace meta {
#if defined(UTL_WORKAROUND_CWG_1558)
template<typename... _Ts>
using type = void;
};
template<typename... _Ts>
#else
template <
typename...>
using void_ = void;
template <
typename...>
using void_t = void;
#endif
struct nat_ {
nat_() = delete;
~nat_() = delete;
nat_(nat_ const&) = delete;
void operator = (nat_ const&) = delete;
};
namespace detail {
template <typename Default,
typename AlwaysVoid,
template<typename...> class Op, typename... Args>
struct detector {
using type = Default;
};
template <typename Default,
template<typename...> class Op, typename... Args>
struct detector <Default,
void_t<Op<Args...>>, Op, Args...> {
using type = Op<Args...>;
};
template <typename Default,
template<typename...> class Op, typename... Args>
using detected_or = detector<Default, void, Op, Args...>;
}
template <template<typename...> class Op, typename... Args>
using is_detected =
typename detail::detector<nat_, void, Op, Args...>::detected;
template< template<typename...> class Op, typename... Args>
template <template<typename...> class Op, typename... Args>
detail::detector<nat_, void, Op, Args...>
>;
template <typename Default,
template<typename...> class Op, typename... Args>
>;
template <typename Expected,
template<typename...> class Op, typename... Args >
>;
template <typename Expected,
template<typename...> class Op, typename... Args >
template <typename To,
template<typename...> class Op, typename... Args >
std::is_convertible<
detected_t<Op, Args...>, To >
>;
template <typename To,
template<typename...> class Op, typename... Args >
}}
#endif