// 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 namespace hana = boost::hana; template struct NoDefault { NoDefault() = delete; NoDefault(NoDefault const&) = default; constexpr explicit NoDefault(int) { } }; template auto operator==(NoDefault const&, NoDefault const&) { return hana::bool_{}; } template auto operator!=(NoDefault const&, NoDefault const&) { return hana::bool_{}; } template struct Default { Default() = default; Default(Default const&) = default; constexpr explicit Default(int) { } }; template auto operator==(Default const&, Default const&) { return hana::bool_{}; } template auto operator!=(Default const&, Default const&) { return hana::bool_{}; } namespace boost { namespace hana { template struct hash_impl> { static constexpr auto apply(NoDefault const&) { return hana::type_c>; }; }; template struct hash_impl> { static constexpr auto apply(Default const&) { return hana::type_c>; }; }; }} int main() { { auto set0 = hana::make_set(); static_assert(std::is_default_constructible{}, ""); auto set1 = hana::make_set(Default<0>(int{})); static_assert(std::is_default_constructible{}, ""); auto set2 = hana::make_set(Default<0>(int{}), Default<1>(int{})); static_assert(std::is_default_constructible{}, ""); auto set3 = hana::make_set(Default<0>(int{}), NoDefault<1>(int{}), Default<2>(int{})); static_assert(!std::is_default_constructible{}, ""); } { auto set1 = hana::make_set(NoDefault<0>(int{})); static_assert(!std::is_default_constructible{}, ""); auto set2 = hana::make_set(NoDefault<0>(int{}), NoDefault<1>(int{})); static_assert(!std::is_default_constructible{}, ""); auto set3 = hana::make_set(NoDefault<0>(int{}), NoDefault<1>(int{}), NoDefault<2>(int{})); static_assert(!std::is_default_constructible{}, ""); } }