brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 93fa96f Raw
57 lines · plain
1//  Copyright Matt Borland 2021.2//  Use, modification and distribution are subject to the3//  Boost Software License, Version 1.0. (See accompanying file4//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)5//6//  https://en.cppreference.com/w/cpp/experimental/is_detected7 8#ifndef BOOST_MATH_TOOLS_IS_DETECTED_HPP9#define BOOST_MATH_TOOLS_IS_DETECTED_HPP10 11#include <boost/math/tools/type_traits.hpp>12 13namespace boost { namespace math { namespace tools {14 15template <typename...>16using void_t = void;17 18namespace detail {19 20template <typename Default, typename AlwaysVoid, template<typename...> class Op, typename... Args>21struct detector22{23    using value_t = boost::math::false_type;24    using type = Default;25};26 27template <typename Default, template<typename...> class Op, typename... Args>28struct detector<Default, void_t<Op<Args...>>, Op, Args...>29{30    using value_t = boost::math::true_type;31    using type = Op<Args...>;32};33 34} // Namespace detail35 36// Special type to indicate detection failure37struct nonesuch38{39    nonesuch() = delete;40    ~nonesuch() = delete;41    nonesuch(const nonesuch&) = delete;42    void operator=(const nonesuch&) = delete;43};44 45template <template<typename...> class Op, typename... Args>46using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;47 48template <template<typename...> class Op, typename... Args>49using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type;50 51template <typename Default, template<typename...> class Op, typename... Args>52using detected_or = detail::detector<Default, void, Op, Args...>;53 54}}} // Namespaces boost math tools55 56#endif // BOOST_MATH_TOOLS_IS_DETECTED_HPP57