1 // 2 // cpp11/require_concept_member.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_conceptobject24 constexpr object<N> require_concept(prop<N>) const 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 object<1> o1 = {}; 45 object<2> o2 = boost::asio::require_concept(o1, prop<2>()); 46 (void)o2; 47 48 const object<1> o3 = {}; 49 object<2> o4 = boost::asio::require_concept(o3, prop<2>()); 50 (void)o4; 51 52 constexpr object<2> o5 = boost::asio::require_concept(object<1>(), prop<2>()); 53 (void)o5; 54 } 55