// Copyright 2019 Hans Dembinski // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_HISTOGRAM_DETAIL_TRY_CAST_HPP #define BOOST_HISTOGRAM_DETAIL_TRY_CAST_HPP #include #include #include #include #include #include #include #include namespace boost { namespace histogram { namespace detail { template BOOST_NORETURN T try_cast_impl(mp11::mp_int<0>, U&&) { BOOST_THROW_EXCEPTION(E("cannot cast " + type_name() + " to " + type_name())); } template T try_cast_impl(mp11::mp_int<1>, U&& u) noexcept { return static_cast(u); } template decltype(auto) try_cast_impl(mp11::mp_int<2>, U&& u) noexcept { return std::forward(u); } // cast fails at runtime with exception E instead of compile-time, T must be a value template decltype(auto) try_cast(U&& u) noexcept(std::is_convertible::value) { return try_cast_impl(mp11::mp_int<(std::is_convertible::value + std::is_same>::value)>{}, std::forward(u)); } } // namespace detail } // namespace histogram } // namespace boost #endif