3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Introspecting static member function</title>
5 <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../index.html" title="Chapter 1. The Type Traits Introspection Library">
8 <link rel="up" href="../index.html" title="Chapter 1. The Type Traits Introspection Library">
9 <link rel="prev" href="tti_detail_has_static_member_data.html" title="Introspecting static member data">
10 <link rel="next" href="tti_detail_has_data.html" title="Introspecting inner data">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="tti_detail_has_static_member_data.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tti_detail_has_data.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="the_type_traits_introspection_library.tti_detail_has_static_member_function"></a><a class="link" href="tti_detail_has_static_member_function.html" title="Introspecting static member function">Introspecting
28 static member function</a>
29 </h2></div></div></div>
31 The TTI macro <code class="computeroutput"><a class="link" href="../BOOST_TT_idm46187185690608.html" title="Macro BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</a></code>
32 introspects a static member function of a class.
35 BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION takes a single parameter which is the
36 name of an inner static member function whose existence the programmer wants
37 to check. The macro generates a metafunction called "has_static_member_function_'name_of_inner_static_member_function'".
40 The metafunction can be invoked in two different ways.
43 The first way is by passing it the enclosing type to introspect and a signature
44 for the static member function as separate template arguments. The signature
45 for the static member function consists of a return type, optional parameter
46 types in the form of a boost::mpl forward sequence of types, and an optional
47 Boost FunctionTypes tag type. A typical boost::mpl forward sequence of types
48 is a boost::mpl::vector<>.
51 The second way is by passing it the enclosing type to introspect and a signature
52 for the static member function as a function. The function has the form of:
54 <pre class="programlisting"><span class="identifier">Return_Type</span> <span class="special">(</span> <span class="identifier">Parameter_Types</span> <span class="special">)</span>
57 where the Parameter_Types may be empty, or a comma-separated list of parameter
58 types if there are more than one parameter type.
61 The metafunction returns a single type called 'type', which is a boost::mpl::bool_.
62 As a convenience the metafunction returns the value of this type directly as
63 a compile time bool constant called 'value'. This is true or false depending
64 on whether the inner static member function, of the specified signature, exists
68 <a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.h0"></a>
69 <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.generating_the_metafunction"></a></span><a class="link" href="tti_detail_has_static_member_function.html#the_type_traits_introspection_library.tti_detail_has_static_member_function.generating_the_metafunction">Generating
73 You generate the metafunction by invoking the macro with the name of an inner
74 static member function:
76 <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">AStaticMemberFunction</span><span class="special">)</span>
79 generates a metafunction called 'has_static_member_function_AStaticMemberFunction'
83 <a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.h1"></a>
84 <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.invoking_the_metafunction"></a></span><a class="link" href="tti_detail_has_static_member_function.html#the_type_traits_introspection_library.tti_detail_has_static_member_function.invoking_the_metafunction">Invoking
88 You invoke the metafunction by instantiating the template with an enclosing
89 type to introspect and the signature of the static member function as a series
90 of template parameters. Alternatively you can invoke the metafunction by passing
91 it an enclosing type and the signature of the static member function as a single
95 A return value called 'value' is a compile time bool constant.
97 <pre class="programlisting"><span class="identifier">has_static_member_function_AStaticMemberFunction</span>
98 <span class="special"><</span>
99 <span class="identifier">Enclosing_Type</span><span class="special">,</span>
100 <span class="identifier">StaticMemberFunction_ReturnType</span><span class="special">,</span>
101 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">StaticMemberFunction_ParameterTypes</span><span class="special">>,</span> <span class="comment">// optional, can be any mpl forward sequence</span>
102 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_types</span><span class="special">::</span><span class="identifier">SomeTagType</span> <span class="comment">// optional, can be any FunctionTypes tag type</span>
103 <span class="special">>::</span><span class="identifier">value</span>
105 <span class="identifier">OR</span>
107 <span class="identifier">has_static_member_function_AStaticMemberFunction</span>
108 <span class="special"><</span>
109 <span class="identifier">Enclosing_Type</span><span class="special">,</span>
110 <span class="identifier">Return_Type</span> <span class="special">(</span> <span class="identifier">Parameter_Types</span> <span class="special">)</span>
111 <span class="special">>::</span><span class="identifier">value</span>
114 <a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.h2"></a>
115 <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.examples"></a></span><a class="link" href="tti_detail_has_static_member_function.html#the_type_traits_introspection_library.tti_detail_has_static_member_function.examples">Examples</a>
118 First we generate metafunctions for various inner static member function names:
120 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">tti</span><span class="special">/</span><span class="identifier">has_static_member_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
122 <span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">function1</span><span class="special">)</span>
123 <span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">function2</span><span class="special">)</span>
124 <span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">function3</span><span class="special">)</span>
127 Next let us create some user-defined types we want to introspect.
129 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">AClass</span> <span class="special">{</span> <span class="special">};</span>
130 <span class="keyword">struct</span> <span class="identifier">Top</span>
131 <span class="special">{</span>
132 <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">function1</span><span class="special">();</span>
133 <span class="keyword">static</span> <span class="identifier">AClass</span> <span class="identifier">function2</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">short</span> <span class="special">*);</span>
134 <span class="special">};</span>
135 <span class="keyword">struct</span> <span class="identifier">Top2</span>
136 <span class="special">{</span>
137 <span class="keyword">static</span> <span class="keyword">long</span> <span class="identifier">function2</span><span class="special">(</span><span class="identifier">Top</span> <span class="special">&,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">bool</span><span class="special">,</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">float</span><span class="special">);</span>
138 <span class="keyword">static</span> <span class="identifier">Top</span> <span class="special">*</span> <span class="identifier">function3</span><span class="special">(</span><span class="keyword">long</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">AClass</span> <span class="special">&);</span>
139 <span class="special">};</span>
142 Finally we invoke our metafunction and return our value. This all happens at
143 compile time, and can be used by programmers doing compile time template metaprogramming.
146 We will show both forms in the following examples. Both forms are completely
147 interchangeable as to the result desired.
149 <pre class="programlisting"><span class="identifier">has_static_member_function_function1</span><span class="special"><</span><span class="identifier">Top</span><span class="special">,</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
150 <span class="identifier">has_static_member_function_function1</span><span class="special"><</span><span class="identifier">Top</span><span class="special">,</span><span class="keyword">int</span> <span class="special">()>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
151 <span class="identifier">has_static_member_function_function1</span><span class="special"><</span><span class="identifier">Top2</span><span class="special">,</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
153 <span class="identifier">has_static_member_function_function2</span><span class="special"><</span><span class="identifier">Top</span><span class="special">,</span><span class="identifier">AClass</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">short</span> <span class="special">*></span> <span class="special">>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
154 <span class="identifier">has_static_member_function_function2</span><span class="special"><</span><span class="identifier">Top2</span><span class="special">,</span><span class="identifier">AClass</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">short</span> <span class="special">*></span> <span class="special">>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
155 <span class="identifier">has_static_member_function_function2</span><span class="special"><</span><span class="identifier">Top2</span><span class="special">,</span><span class="keyword">long</span> <span class="special">(</span><span class="identifier">Top</span> <span class="special">&,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">bool</span><span class="special">,</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">float</span><span class="special">)>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
157 <span class="identifier">has_static_member_function_function3</span><span class="special"><</span><span class="identifier">Top2</span><span class="special">,</span><span class="keyword">int</span> <span class="special">()>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
158 <span class="identifier">has_static_member_function_function3</span><span class="special"><</span><span class="identifier">Top2</span><span class="special">,</span><span class="identifier">Top</span> <span class="special">*</span> <span class="special">(</span><span class="keyword">long</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">AClass</span> <span class="special">&)>::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true;</span>
161 <a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.h3"></a>
162 <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_static_member_function.metafunction_re_use"></a></span><a class="link" href="tti_detail_has_static_member_function.html#the_type_traits_introspection_library.tti_detail_has_static_member_function.metafunction_re_use">Metafunction
166 The macro encodes only the name of the static member function for which we
167 are searching and the fact that we are introspecting for a static member function
168 within an enclosing type.
171 Because of this, once we create our metafunction for introspecting a static
172 member function by name, we can reuse the metafunction for introspecting any
173 enclosing type, having any static member function, for that name.
176 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
177 <td align="left"></td>
178 <td align="right"><div class="copyright-footer">Copyright © 2011-2013 Tropic Software
180 Distributed under the Boost Software License, Version 1.0. (See accompanying
181 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
186 <div class="spirit-nav">
187 <a accesskey="p" href="tti_detail_has_static_member_data.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tti_detail_has_data.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>