2 // Copyright Louis Dionne 2013-2017
4 // Distributed under the Boost Software License, Version 1.0.
5 //(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
7 #ifndef BOOST_GIL_DETAIL_STD_COMMON_TYPE_HPP
8 #define BOOST_GIL_DETAIL_STD_COMMON_TYPE_HPP
10 #include <type_traits>
13 namespace boost { namespace gil { namespace detail {
15 // Defines a SFINAE-friendly version of `std::common_type`.
17 // Based on boost/hana/detail/std_common_type.hpp
18 // Equivalent to `std::common_type`, except it is SFINAE-friendly and
19 // does not support custom specializations.
21 template <typename T, typename U, typename = void>
22 struct std_common_type {};
24 template <typename T, typename U>
25 struct std_common_type
28 decltype((void)(true ? std::declval<T>() : std::declval<U>()))
31 using type = typename std::decay
33 decltype(true ? std::declval<T>() : std::declval<U>())
37 }}} // namespace boost::gil::detail