1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
4 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
6 <meta name="generator" content="Doxygen 1.9.1"/>
7 <meta name="viewport" content="width=device-width, initial-scale=1"/>
8 <title>libsigc++: Functors</title>
9 <link href="tabs.css" rel="stylesheet" type="text/css"/>
10 <script type="text/javascript" src="jquery.js"></script>
11 <script type="text/javascript" src="dynsections.js"></script>
12 <link href="doxygen.css" rel="stylesheet" type="text/css" />
13 <link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
16 <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
18 <table cellspacing="0" cellpadding="0">
20 <tr style="height: 56px;">
21 <td id="projectalign" style="padding-left: 0.5em;">
22 <div id="projectname">libsigc++
23  <span id="projectnumber">2.10.8</span>
30 <!-- end header part -->
31 <!-- Generated by Doxygen 1.9.1 -->
32 <script type="text/javascript" src="menudata.js"></script>
33 <script type="text/javascript" src="menu.js"></script>
34 <script type="text/javascript">
35 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
37 initMenu('',false,false,'search.php','Search');
39 /* @license-end */</script>
40 <div id="main-nav"></div>
44 <a href="#groups">Modules</a> |
45 <a href="#nested-classes">Classes</a> |
46 <a href="#define-members">Macros</a> |
47 <a href="#func-members">Functions</a> </div>
48 <div class="headertitle">
49 <div class="title">Functors</div> </div>
51 <div class="contents">
53 <p>Functors are copyable types that define operator()().
54 <a href="#details">More...</a></p>
55 <table class="memberdecls">
56 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
57 Modules</h2></td></tr>
58 <tr class="memitem:group__slot"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__slot.html">Slots</a></td></tr>
59 <tr class="memdesc:group__slot"><td class="mdescLeft"> </td><td class="mdescRight">Slots are type-safe representations of callback methods and functions. <br /></td></tr>
60 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
61 <tr class="memitem:group__mem__fun"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__mem__fun.html">mem_fun()</a></td></tr>
62 <tr class="memdesc:group__mem__fun"><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419" title="Creates a functor of type sigc::mem_functor0 which wraps a method.">mem_fun()</a> Creates a functor from a pointer to a method. <br /></td></tr>
63 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
64 <tr class="memitem:group__ptr__fun"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ptr__fun.html">ptr_fun()</a></td></tr>
65 <tr class="memdesc:group__ptr__fun"><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="group__ptr__fun.html#ga9c80de72f656fb05e81fda622dddc863" title="Creates a functor of type sigc::pointer_functor0 which wraps an existing non-member function.">ptr_fun()</a> is used to convert a pointer to a function to a functor. <br /></td></tr>
66 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
67 </table><table class="memberdecls">
68 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
69 Classes</h2></td></tr>
70 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classsigc_1_1can__deduce__result__type__with__decltype.html">sigc::can_deduce_result_type_with_decltype< T_functor ></a></td></tr>
71 <tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Helper class, to determine if decltype() can deduce the result type of a functor. <a href="classsigc_1_1can__deduce__result__type__with__decltype.html#details">More...</a><br /></td></tr>
72 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
73 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structsigc_1_1functor__base.html">sigc::functor_base</a></td></tr>
74 <tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">A hint to the compiler. <a href="structsigc_1_1functor__base.html#details">More...</a><br /></td></tr>
75 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
76 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structsigc_1_1functor__trait.html">sigc::functor_trait< T_functor, I_derives_functor_base, I_can_use_decltype ></a></td></tr>
77 <tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Trait that specifies the return type of any type. <a href="structsigc_1_1functor__trait.html#details">More...</a><br /></td></tr>
78 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
79 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structsigc_1_1visitor.html">sigc::visitor< T_functor ></a></td></tr>
80 <tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="structsigc_1_1visitor.html#a9fe5d6be845e622a99a0db5d3621d4b3">sigc::visitor<T_functor>::do_visit_each()</a> performs a functor on each of the targets of a functor. <a href="structsigc_1_1visitor.html#details">More...</a><br /></td></tr>
81 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
82 </table><table class="memberdecls">
83 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
85 <tr class="memitem:ga7a6f5575dc0b0ea896889c782721f6be"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be">SIGC_FUNCTOR_TRAIT</a>(T_functor, T_return)</td></tr>
86 <tr class="memdesc:ga7a6f5575dc0b0ea896889c782721f6be"><td class="mdescLeft"> </td><td class="mdescRight">Helper macro, if you want to mix user-defined and third party functors with libsigc++. <a href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be">More...</a><br /></td></tr>
87 <tr class="separator:ga7a6f5575dc0b0ea896889c782721f6be"><td class="memSeparator" colspan="2"> </td></tr>
88 <tr class="memitem:gadf1ba3cacb09cc5c3c3e399836ec6e50"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sigcfunctors.html#gadf1ba3cacb09cc5c3c3e399836ec6e50">SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</a></td></tr>
89 <tr class="memdesc:gadf1ba3cacb09cc5c3c3e399836ec6e50"><td class="mdescLeft"> </td><td class="mdescRight">Helper macro, if you want to mix user-defined and third party functors with libsigc++. <a href="group__sigcfunctors.html#gadf1ba3cacb09cc5c3c3e399836ec6e50">More...</a><br /></td></tr>
90 <tr class="separator:gadf1ba3cacb09cc5c3c3e399836ec6e50"><td class="memSeparator" colspan="2"> </td></tr>
91 <tr class="memitem:ga93b6ee8815d90adccfdceed72bcda577"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sigcfunctors.html#ga93b6ee8815d90adccfdceed72bcda577">SIGC_FUNCTORS_HAVE_RESULT_TYPE</a></td></tr>
92 <tr class="memdesc:ga93b6ee8815d90adccfdceed72bcda577"><td class="mdescLeft"> </td><td class="mdescRight">Helper macro, if you want to mix user-defined and third party functors with libsigc++. <a href="group__sigcfunctors.html#ga93b6ee8815d90adccfdceed72bcda577">More...</a><br /></td></tr>
93 <tr class="separator:ga93b6ee8815d90adccfdceed72bcda577"><td class="memSeparator" colspan="2"> </td></tr>
94 </table><table class="memberdecls">
95 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
96 Functions</h2></td></tr>
97 <tr class="memitem:ga64cb7832acc1e58efb5ffe0b4f5e9404"><td class="memTemplParams" colspan="2">template<class T_action , class T_functor > </td></tr>
98 <tr class="memitem:ga64cb7832acc1e58efb5ffe0b4f5e9404"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__sigcfunctors.html#ga64cb7832acc1e58efb5ffe0b4f5e9404">sigc::visit_each</a> (const T_action & _A_action, const T_functor & _A_functor)</td></tr>
99 <tr class="memdesc:ga64cb7832acc1e58efb5ffe0b4f5e9404"><td class="mdescLeft"> </td><td class="mdescRight">This function performs a functor on each of the targets of a functor. <a href="group__sigcfunctors.html#ga64cb7832acc1e58efb5ffe0b4f5e9404">More...</a><br /></td></tr>
100 <tr class="separator:ga64cb7832acc1e58efb5ffe0b4f5e9404"><td class="memSeparator" colspan="2"> </td></tr>
101 <tr class="memitem:gada222d975b87d64cfa7a7f29244ae587"><td class="memTemplParams" colspan="2">template<class T_type , class T_action , class T_functor > </td></tr>
102 <tr class="memitem:gada222d975b87d64cfa7a7f29244ae587"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__sigcfunctors.html#gada222d975b87d64cfa7a7f29244ae587">sigc::visit_each_type</a> (const T_action & _A_action, const T_functor & _A_functor)</td></tr>
103 <tr class="memdesc:gada222d975b87d64cfa7a7f29244ae587"><td class="mdescLeft"> </td><td class="mdescRight">This function performs a functor on each of the targets of a functor limited to a restricted type. <a href="group__sigcfunctors.html#gada222d975b87d64cfa7a7f29244ae587">More...</a><br /></td></tr>
104 <tr class="separator:gada222d975b87d64cfa7a7f29244ae587"><td class="memSeparator" colspan="2"> </td></tr>
106 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
107 <p>Functors are copyable types that define operator()(). </p>
108 <p>Types that define operator()() overloads with different return types are referred to as multi-type functors. Multi-type functors are only partially supported in libsigc++.</p>
109 <p>Closures are functors that store all information needed to invoke a callback from operator()().</p>
110 <p>Adaptors are functors that alter the signature of a functor's operator()().</p>
111 <p>libsigc++ defines numerous functors, closures and adaptors. Since libsigc++ is a callback library, most functors are also closures. The documentation doesn't distinguish between functors and closures.</p>
112 <p>The basic functor types libsigc++ provides are created with <a class="el" href="group__ptr__fun.html#ga9c80de72f656fb05e81fda622dddc863" title="Creates a functor of type sigc::pointer_functor0 which wraps an existing non-member function.">ptr_fun()</a> and <a class="el" href="group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419" title="Creates a functor of type sigc::mem_functor0 which wraps a method.">mem_fun()</a> and can be converted into slots implicitly. The set of adaptors that ships with libsigc++ is documented in the <a class="el" href="group__adaptors.html">Adaptors</a> module.</p>
113 <p>If you want to mix user-defined and third party functors with libsigc++, and you want them to be implicitly convertible into slots, libsigc++ must know the result type of your functors. There are different ways to achieve that.</p>
115 <li>Derive your functors from <a class="el" href="structsigc_1_1functor__base.html" title="A hint to the compiler.">sigc::functor_base</a> and place <code>typedef T_return result_type;</code> in the class definition.</li>
116 <li>Use the macro <a class="el" href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be" title="Helper macro, if you want to mix user-defined and third party functors with libsigc++.">SIGC_FUNCTOR_TRAIT(T_functor,T_return)</a> in namespace sigc. Multi-type functors are only partly supported.</li>
117 <li>For functors not derived from <a class="el" href="structsigc_1_1functor__base.html" title="A hint to the compiler.">sigc::functor_base</a>, and not specified with <a class="el" href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be" title="Helper macro, if you want to mix user-defined and third party functors with libsigc++.">SIGC_FUNCTOR_TRAIT()</a>, libsigc++ tries to deduce the result type with the C++11 decltype() specifier. That attempt usually succeeds if the functor has a single operator()(), but it fails if operator()() is overloaded.</li>
118 <li>Use the macro <a class="el" href="group__sigcfunctors.html#ga93b6ee8815d90adccfdceed72bcda577" title="Helper macro, if you want to mix user-defined and third party functors with libsigc++.">SIGC_FUNCTORS_HAVE_RESULT_TYPE</a>, if you want libsigc++ to assume that result_type is defined in all user-defined or third party functors, whose result type can't be deduced in any other way.</li>
120 <p>If all these ways to deduce the result type fail, void is assumed.</p>
121 <p>With libsigc++ versions before 2.6, the macro <a class="el" href="group__sigcfunctors.html#gadf1ba3cacb09cc5c3c3e399836ec6e50" title="Helper macro, if you want to mix user-defined and third party functors with libsigc++.">SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</a> activated the test with decltype(). That macro is now unneccesary and deprecated. </p>
122 <h2 class="groupheader">Macro Definition Documentation</h2>
123 <a id="ga7a6f5575dc0b0ea896889c782721f6be"></a>
124 <h2 class="memtitle"><span class="permalink"><a href="#ga7a6f5575dc0b0ea896889c782721f6be">◆ </a></span>SIGC_FUNCTOR_TRAIT</h2>
126 <div class="memitem">
127 <div class="memproto">
128 <table class="memname">
130 <td class="memname">#define SIGC_FUNCTOR_TRAIT</td>
132 <td class="paramtype"> </td>
133 <td class="paramname">T_functor, </td>
136 <td class="paramkey"></td>
138 <td class="paramtype"> </td>
139 <td class="paramname">T_return </td>
147 </div><div class="memdoc">
149 <p>Helper macro, if you want to mix user-defined and third party functors with libsigc++. </p>
150 <p>If you want to mix functors not derived from <a class="el" href="structsigc_1_1functor__base.html" title="A hint to the compiler.">sigc::functor_base</a> with libsigc++, and these functors don't define <code>result_type</code>, use this macro inside namespace sigc to expose the return type of the functors like so: </p><div class="fragment"><div class="line"><span class="keyword">namespace </span><a class="code" href="namespacesigc.html">sigc</a> {</div>
151 <div class="line"> <a class="code" href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be">SIGC_FUNCTOR_TRAIT</a>(first_functor_type, return_type_of_first_functor_type)</div>
152 <div class="line"> <a class="code" href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be">SIGC_FUNCTOR_TRAIT</a>(second_functor_type, return_type_of_second_functor_type)</div>
153 <div class="line"> ...</div>
154 <div class="line">}</div>
155 <div class="ttc" id="agroup__sigcfunctors_html_ga7a6f5575dc0b0ea896889c782721f6be"><div class="ttname"><a href="group__sigcfunctors.html#ga7a6f5575dc0b0ea896889c782721f6be">SIGC_FUNCTOR_TRAIT</a></div><div class="ttdeci">#define SIGC_FUNCTOR_TRAIT(T_functor, T_return)</div><div class="ttdoc">Helper macro, if you want to mix user-defined and third party functors with libsigc++.</div><div class="ttdef"><b>Definition:</b> functor_trait.h:188</div></div>
156 <div class="ttc" id="anamespacesigc_html"><div class="ttname"><a href="namespacesigc.html">sigc</a></div><div class="ttdoc">The libsigc++ namespace.</div><div class="ttdef"><b>Definition:</b> limit_reference.h:12</div></div>
157 </div><!-- fragment -->
160 <a id="gadf1ba3cacb09cc5c3c3e399836ec6e50"></a>
161 <h2 class="memtitle"><span class="permalink"><a href="#gadf1ba3cacb09cc5c3c3e399836ec6e50">◆ </a></span>SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</h2>
163 <div class="memitem">
164 <div class="memproto">
165 <table class="memname">
167 <td class="memname">#define SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</td>
170 </div><div class="memdoc">
172 <p>Helper macro, if you want to mix user-defined and third party functors with libsigc++. </p>
173 <p>If you want to mix functors not derived from <a class="el" href="structsigc_1_1functor__base.html" title="A hint to the compiler.">sigc::functor_base</a> with libsigc++, and your compiler can deduce the result type of the functor with the C++11 keyword <code>decltype</code>, use this macro inside namespace sigc like so: </p><div class="fragment"><div class="line"><span class="keyword">namespace </span><a class="code" href="namespacesigc.html">sigc</a> {</div>
174 <div class="line"> <a class="code" href="group__sigcfunctors.html#gadf1ba3cacb09cc5c3c3e399836ec6e50">SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</a></div>
175 <div class="line">}</div>
176 <div class="ttc" id="agroup__sigcfunctors_html_gadf1ba3cacb09cc5c3c3e399836ec6e50"><div class="ttname"><a href="group__sigcfunctors.html#gadf1ba3cacb09cc5c3c3e399836ec6e50">SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</a></div><div class="ttdeci">#define SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE</div><div class="ttdoc">Helper macro, if you want to mix user-defined and third party functors with libsigc++.</div><div class="ttdef"><b>Definition:</b> functor_trait.h:223</div></div>
177 </div><!-- fragment --><p>Functors with overloaded operator()() are not supported.</p>
178 <dl class="since_2_2_11"><dt><b><a class="el" href="since_2_2_11.html#_since_2_2_11000001">Since libsigc++ 2.2.11:</a></b></dt><dd></dd></dl>
179 <dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000065">Deprecated:</a></b></dt><dd>This macro does nothing. The test it activated in libsigc++ versions before 2.6, is now unconditionally activated.</dd></dl>
183 <a id="ga93b6ee8815d90adccfdceed72bcda577"></a>
184 <h2 class="memtitle"><span class="permalink"><a href="#ga93b6ee8815d90adccfdceed72bcda577">◆ </a></span>SIGC_FUNCTORS_HAVE_RESULT_TYPE</h2>
186 <div class="memitem">
187 <div class="memproto">
188 <table class="memname">
190 <td class="memname">#define SIGC_FUNCTORS_HAVE_RESULT_TYPE</td>
193 </div><div class="memdoc">
195 <p>Helper macro, if you want to mix user-defined and third party functors with libsigc++. </p>
196 <p>If you want to mix functors not derived from <a class="el" href="structsigc_1_1functor__base.html" title="A hint to the compiler.">sigc::functor_base</a> with libsigc++, and these functors define <code>result_type</code>, use this macro inside namespace sigc like so: </p><div class="fragment"><div class="line"><span class="keyword">namespace </span><a class="code" href="namespacesigc.html">sigc</a> { <a class="code" href="group__sigcfunctors.html#ga93b6ee8815d90adccfdceed72bcda577">SIGC_FUNCTORS_HAVE_RESULT_TYPE</a> }</div>
197 <div class="ttc" id="agroup__sigcfunctors_html_ga93b6ee8815d90adccfdceed72bcda577"><div class="ttname"><a href="group__sigcfunctors.html#ga93b6ee8815d90adccfdceed72bcda577">SIGC_FUNCTORS_HAVE_RESULT_TYPE</a></div><div class="ttdeci">#define SIGC_FUNCTORS_HAVE_RESULT_TYPE</div><div class="ttdoc">Helper macro, if you want to mix user-defined and third party functors with libsigc++.</div><div class="ttdef"><b>Definition:</b> functor_trait.h:165</div></div>
198 </div><!-- fragment -->
201 <h2 class="groupheader">Function Documentation</h2>
202 <a id="ga64cb7832acc1e58efb5ffe0b4f5e9404"></a>
203 <h2 class="memtitle"><span class="permalink"><a href="#ga64cb7832acc1e58efb5ffe0b4f5e9404">◆ </a></span>visit_each()</h2>
205 <div class="memitem">
206 <div class="memproto">
207 <div class="memtemplate">
208 template <class T_action , class T_functor > </div>
209 <table class="memname">
211 <td class="memname">void sigc::visit_each </td>
213 <td class="paramtype">const T_action & </td>
214 <td class="paramname"><em>_A_action</em>, </td>
217 <td class="paramkey"></td>
219 <td class="paramtype">const T_functor & </td>
220 <td class="paramname"><em>_A_functor</em> </td>
228 </div><div class="memdoc">
230 <p>This function performs a functor on each of the targets of a functor. </p>
234 <a id="gada222d975b87d64cfa7a7f29244ae587"></a>
235 <h2 class="memtitle"><span class="permalink"><a href="#gada222d975b87d64cfa7a7f29244ae587">◆ </a></span>visit_each_type()</h2>
237 <div class="memitem">
238 <div class="memproto">
239 <div class="memtemplate">
240 template <class T_type , class T_action , class T_functor > </div>
241 <table class="memname">
243 <td class="memname">void sigc::visit_each_type </td>
245 <td class="paramtype">const T_action & </td>
246 <td class="paramname"><em>_A_action</em>, </td>
249 <td class="paramkey"></td>
251 <td class="paramtype">const T_functor & </td>
252 <td class="paramname"><em>_A_functor</em> </td>
260 </div><div class="memdoc">
262 <p>This function performs a functor on each of the targets of a functor limited to a restricted type. </p>
266 </div><!-- contents -->
267 <!-- start footer part -->
268 <hr class="footer"/><address class="footer"><small>
269 Generated on Fri Feb 11 2022 15:40:57 for libsigc++ by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1