// 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 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) ); static const bool value = type::value; }; using boost::mp11::mp_defer; template using add_pointer = T*; template using add_pointer_impl = mp_defer; using boost::mp11::mp_quote; using Q_add_pointer = mp_quote; template using Q_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>)); #if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) BOOST_TEST_TRAIT_TRUE((has_type>)); #endif BOOST_TEST_TRAIT_TRUE((std::is_same::type, void*>)); #if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) BOOST_TEST_TRAIT_TRUE((has_type>)); #endif 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(); }