// Copyright 2015-2017 Peter Dimov. // // 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 #include #include #include #include #include #include using boost::mp11::mp_identity; using boost::mp11::mp_true; using boost::mp11::mp_false; template struct has_type { template static mp_true f( mp_identity* ); template static mp_false f( ... ); using type = decltype( f(0) ); #if BOOST_WORKAROUND( BOOST_GCC, < 40800 ) static constexpr auto value = type::value; #else static const auto value = type::value; #endif }; using boost::mp11::mp_defer; template using add_pointer = T*; template using add_pointer_impl = mp_defer; int main() { BOOST_TEST_TRAIT_TRUE((has_type>)); BOOST_TEST_TRAIT_TRUE((std::is_same::type, void*>)); BOOST_TEST_TRAIT_TRUE((has_type>)); BOOST_TEST_TRAIT_TRUE((std::is_same::type, int*>)); BOOST_TEST_TRAIT_FALSE((has_type>)); BOOST_TEST_TRAIT_FALSE((has_type>)); return boost::report_errors(); }