// Copyright Louis Dionne 2013-2017 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include namespace hana = boost::hana; struct x1; struct x2; struct x3; struct y1 { }; struct y2 { }; struct y3 { }; struct f { template struct apply { struct type; }; }; template constexpr auto valid_call(F f, T ...t) -> decltype(((void)f(t...)), true) { return true; } constexpr auto valid_call(...) { return false; } BOOST_HANA_CONSTANT_CHECK(hana::equal( hana::metafunction_class(), hana::type_c::type> )); BOOST_HANA_CONSTANT_CHECK(hana::equal( hana::metafunction_class(hana::type_c), hana::type_c::type> )); BOOST_HANA_CONSTANT_CHECK(hana::equal( hana::metafunction_class(hana::type_c, hana::type_c), hana::type_c::type> )); BOOST_HANA_CONSTANT_CHECK(hana::equal( hana::metafunction_class(hana::type_c, hana::type_c, hana::type_c), hana::type_c::type> )); using F = decltype(hana::metafunction_class); static_assert(std::is_same, f::apply<>>{}, ""); static_assert(std::is_same, f::apply>{}, ""); static_assert(std::is_same, f::apply>{}, ""); static_assert(std::is_same, f::apply>{}, ""); // Make sure we're SFINAE-friendly struct no_type { template struct apply { }; }; static_assert(!valid_call(hana::metafunction_class), ""); static_assert(!valid_call(hana::metafunction_class, hana::type_c), ""); // Make sure we model the Metafunction concept static_assert(hana::Metafunction)>::value, ""); static_assert(hana::Metafunction)&>::value, ""); // Make sure metafunction_class is SFINAE-friendly struct not_a_mfc1 { template struct apply { }; }; struct not_a_mfc2 { }; BOOST_HANA_CONSTANT_CHECK(hana::not_( hana::is_valid(hana::metafunction_class)(hana::type_c) )); BOOST_HANA_CONSTANT_CHECK(hana::not_( hana::is_valid(hana::metafunction_class)(hana::type_c) )); // Make sure we don't read from a non-constexpr variable int main() { auto t = hana::type_c; constexpr auto r = hana::metafunction_class(t); (void)r; }