1 // 2 // cpp11/can_require_concept_free.cpp 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #include <boost/asio/require_concept.hpp> 12 #include <cassert> 13 14 template <int> 15 struct prop 16 { 17 static constexpr bool is_requirable_concept = true; 18 }; 19 20 template <int> 21 struct object 22 { 23 template <int N> require_concept(const object &,prop<N>)24 friend constexpr object<N> require_concept(const object&, prop<N>) 25 { 26 return object<N>(); 27 } 28 }; 29 30 namespace boost { 31 namespace asio { 32 33 template<int N, int M> 34 struct is_applicable_property<object<N>, prop<M> > 35 { 36 static constexpr bool value = true; 37 }; 38 39 } // namespace asio 40 } // namespace boost 41 main()42int main() 43 { 44 static_assert(boost::asio::can_require_concept<object<1>, prop<2>>::value, ""); 45 static_assert(boost::asio::can_require_concept<const object<1>, prop<2>>::value, ""); 46 } 47