1 2 // (C) Copyright Edward Diener 2011,2012,2013 3 // Use, modification and distribution are subject to the Boost Software License, 4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt). 6 7 #if !defined(BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_HPP) 8 #define BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_HPP 9 10 #include <boost/config.hpp> 11 #include <boost/function_types/property_tags.hpp> 12 #include <boost/mpl/vector.hpp> 13 #include <boost/preprocessor/cat.hpp> 14 #include <boost/tti/detail/dstatic_mem_fun.hpp> 15 #include <boost/tti/gen/has_static_member_function_gen.hpp> 16 17 /* 18 19 The succeeding comments in this file are in doxygen format. 20 21 */ 22 23 /** \file 24 */ 25 26 /// A macro which expands to a metafunction which tests whether a static member function with a particular name and signature exists. 27 /** 28 29 BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION is a macro which expands to a metafunction. 30 The metafunction tests whether a static member function with a particular name 31 and signature exists. The macro takes the form of BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) where 32 33 trait = the name of the metafunction <br/> 34 name = the name of the inner member. 35 36 BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION generates a metafunction called "trait" where 'trait' is the macro parameter. 37 38 @code 39 40 template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG> 41 struct trait 42 { 43 static const value = unspecified; 44 typedef mpl::bool_<true-or-false> type; 45 }; 46 47 The metafunction types and return: 48 49 BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'. 50 The enclosing type can be a class, struct, or union. 51 52 BOOST_TTI_TP_R = the return type of the static member function 53 OR 54 the signature of a function in the form of Return_Type ( Parameter_Types ) 55 56 BOOST_TTI_TP_FS = (optional) the parameters of the static member function as a boost::mpl forward sequence 57 if the second parameter is a return type and the function parameters exist. 58 59 BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the static member function 60 if the second parameter is a return type and the need for a tag exists. 61 62 returns = 'value' is true if the 'name' exists, 63 with the appropriate static member function type, 64 otherwise 'value' is false. 65 66 @endcode 67 68 */ 69 #define BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \ 70 BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \ 71 template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS = boost::mpl::vector<>,class BOOST_TTI_TP_TAG = boost::function_types::null_tag> \ 72 struct trait \ 73 { \ 74 typedef typename \ 75 BOOST_PP_CAT(trait,_detail_hsmf)<BOOST_TTI_TP_T,BOOST_TTI_TP_R,BOOST_TTI_TP_FS,BOOST_TTI_TP_TAG>::type type; \ 76 BOOST_STATIC_CONSTANT(bool,value=type::value); \ 77 }; \ 78 /**/ 79 80 /// A macro which expands to a metafunction which tests whether a static member function with a particular name and signature exists. 81 /** 82 83 BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION is a macro which expands to a metafunction. 84 The metafunction tests whether a static member function with a particular name 85 and signature exists. The macro takes the form of BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(name) where 86 87 name = the name of the inner member. 88 89 BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION generates a metafunction called "has_static_member_function_name" where 'name' is the macro parameter. 90 91 @code 92 93 template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG> 94 struct has_static_member_function_'name' 95 { 96 static const value = unspecified; 97 typedef mpl::bool_<true-or-false> type; 98 }; 99 100 The metafunction types and return: 101 102 BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'. 103 The enclosing type can be a class, struct, or union. 104 105 BOOST_TTI_TP_R = the return type of the static member function 106 OR 107 the signature of a function in the form of Return_Type ( Parameter_Types ) 108 109 BOOST_TTI_TP_FS = (optional) the parameters of the static member function as a boost::mpl forward sequence 110 if the second parameter is a return type and the function parameters exist. 111 112 BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the static member function 113 if the second parameter is a return type and the need for a tag exists. 114 115 returns = 'value' is true if the 'name' exists, 116 with the appropriate static member function type, 117 otherwise 'value' is false. 118 119 @endcode 120 121 */ 122 #define BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(name) \ 123 BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION \ 124 ( \ 125 BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_GEN(name), \ 126 name \ 127 ) \ 128 /**/ 129 130 #endif // BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_HPP 131