index.html 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Chapter&#160;1.&#160;Boost.Functional/Factory 1.0</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&#160;1.&#160;Boost.Functional/Factory 1.0">
  8. </head>
  9. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  10. <table cellpadding="2" width="100%"><tr>
  11. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
  12. <td align="center"><a href="../../../../../index.html">Home</a></td>
  13. <td align="center"><a href="../../../../libraries.htm">Libraries</a></td>
  14. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  15. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  16. <td align="center"><a href="../../../../../more/index.htm">More</a></td>
  17. </tr></table>
  18. <hr>
  19. <div class="spirit-nav"></div>
  20. <div class="chapter">
  21. <div class="titlepage"><div>
  22. <div><h2 class="title">
  23. <a name="boost_functional_factory"></a>Chapter&#160;1.&#160;Boost.Functional/Factory 1.0</h2></div>
  24. <div><div class="author"><h3 class="author">
  25. <span class="firstname">Tobias</span> <span class="surname">Schwinger</span>
  26. </h3></div></div>
  27. <div><div class="author"><h3 class="author">
  28. <span class="firstname">Glen</span> <span class="surname">Fernandes</span>
  29. </h3></div></div>
  30. <div><p class="copyright">Copyright &#169; 2007, 2008 Tobias Schwinger</p></div>
  31. <div><p class="copyright">Copyright &#169; 2019 Glen Joseph Fernandes</p></div>
  32. <div><div class="legalnotice">
  33. <a name="boost_functional_factory.legal"></a><p>
  34. Distributed under the Boost Software License, Version 1.0.
  35. </p>
  36. </div></div>
  37. </div></div>
  38. <div class="toc">
  39. <p><b>Table of Contents</b></p>
  40. <dl class="toc">
  41. <dt><span class="section"><a href="index.html#boost_functional_factory.brief_description">Brief Description</a></span></dt>
  42. <dt><span class="section"><a href="index.html#boost_functional_factory.background">Background</a></span></dt>
  43. <dt><span class="section"><a href="index.html#boost_functional_factory.reference">Reference</a></span></dt>
  44. <dt><span class="section"><a href="index.html#boost_functional_factory.changes">Changes</a></span></dt>
  45. <dt><span class="section"><a href="index.html#boost_functional_factory.acknowledgements">Acknowledgements</a></span></dt>
  46. <dt><span class="section"><a href="index.html#boost_functional_factory.references">References</a></span></dt>
  47. </dl>
  48. </div>
  49. <div class="section">
  50. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  51. <a name="boost_functional_factory.brief_description"></a><a class="link" href="index.html#boost_functional_factory.brief_description" title="Brief Description">Brief Description</a>
  52. </h2></div></div></div>
  53. <p>
  54. The template <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">factory</span></code> lets you encapsulate a <code class="computeroutput"><span class="keyword">new</span></code> expression as a function object, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">value_factory</span></code>
  55. encapsulates a constructor invocation without <code class="computeroutput"><span class="keyword">new</span></code>.
  56. </p>
  57. <p>
  58. </p>
  59. <pre class="programlisting"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">factory</span></code><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;()(</span><span class="identifier">arg1</span><span class="special">,</span><span class="identifier">arg2</span><span class="special">,</span><span class="identifier">arg3</span><span class="special">)</span>
  60. <span class="comment">// same as new T(arg1,arg2,arg3)</span>
  61. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">value_factory</span></code><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;()(</span><span class="identifier">arg1</span><span class="special">,</span><span class="identifier">arg2</span><span class="special">,</span><span class="identifier">arg3</span><span class="special">)</span>
  62. <span class="comment">// same as T(arg1,arg2,arg3)</span>
  63. </pre>
  64. <p>
  65. </p>
  66. <p>
  67. Before C++11 the arguments to the function objects have to be LValues. A factory
  68. that also accepts RValues can be composed using the <a href="http://www.boost.org/libs/functional/forward/doc/index.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward_adapter</span></code></a>
  69. or <a href="http://www.boost.org/libs/bind/bind.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code></a>.
  70. In C++11 or higher the arguments can be LValues or RValues.
  71. </p>
  72. </div>
  73. <div class="section">
  74. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  75. <a name="boost_functional_factory.background"></a><a class="link" href="index.html#boost_functional_factory.background" title="Background">Background</a>
  76. </h2></div></div></div>
  77. <p>
  78. In traditional Object Oriented Programming a Factory is an object implementing
  79. an interface of one or more methods that construct objects conforming to known
  80. interfaces.
  81. </p>
  82. <p>
  83. </p>
  84. <pre class="programlisting"><span class="comment">// assuming a_concrete_class and another_concrete_class are derived</span>
  85. <span class="comment">// from an_abstract_class</span>
  86. <span class="keyword">struct</span> <span class="identifier">a_factory</span> <span class="special">{</span>
  87. <span class="keyword">virtual</span> <span class="identifier">an_abstract_class</span><span class="special">*</span> <span class="identifier">create</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  88. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">a_factory</span><span class="special">()</span> <span class="special">{</span> <span class="special">}</span>
  89. <span class="special">};</span>
  90. <span class="keyword">struct</span> <span class="identifier">a_concrete_factory</span>
  91. <span class="special">:</span> <span class="identifier">a_factory</span> <span class="special">{</span>
  92. <span class="identifier">an_abstract_class</span><span class="special">*</span> <span class="identifier">create</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  93. <span class="keyword">return</span> <span class="keyword">new</span> <span class="identifier">a_concrete_class</span><span class="special">();</span>
  94. <span class="special">}</span>
  95. <span class="special">};</span>
  96. <span class="keyword">struct</span> <span class="identifier">another_concrete_factory</span>
  97. <span class="special">:</span> <span class="identifier">a_factory</span> <span class="special">{</span>
  98. <span class="identifier">an_abstract_class</span><span class="special">*</span> <span class="identifier">create</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  99. <span class="keyword">return</span> <span class="keyword">new</span> <span class="identifier">another_concrete_class</span><span class="special">();</span>
  100. <span class="special">}</span>
  101. <span class="special">};</span>
  102. <span class="comment">// [...]</span>
  103. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  104. <span class="special">{</span>
  105. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ptr_map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">a_factory</span><span class="special">&gt;</span> <span class="identifier">factories</span><span class="special">;</span>
  106. <span class="comment">// [...]</span>
  107. <span class="identifier">factories</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"a_name"</span><span class="special">,</span>
  108. <span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">a_factory</span><span class="special">&gt;(</span><span class="keyword">new</span> <span class="identifier">a_concrete_factory</span><span class="special">));</span>
  109. <span class="identifier">factories</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"another_name"</span><span class="special">,</span>
  110. <span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">a_factory</span><span class="special">&gt;(</span><span class="keyword">new</span> <span class="identifier">another_concrete_factory</span><span class="special">));</span>
  111. <span class="comment">// [...]</span>
  112. <span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">an_abstract_class</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="identifier">factories</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">some_name</span><span class="special">).</span><span class="identifier">create</span><span class="special">());</span>
  113. <span class="comment">// [...]</span>
  114. <span class="special">}</span>
  115. </pre>
  116. <p>
  117. </p>
  118. <p>
  119. This approach has several drawbacks. The most obvious one is that there is
  120. lots of boilerplate code. In other words there is too much code to express
  121. a rather simple intention. We could use templates to get rid of some of it
  122. but the approach remains inflexible:
  123. </p>
  124. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  125. <li class="listitem">
  126. We may want a factory that takes some arguments that are forwarded to the
  127. constructor,
  128. </li>
  129. <li class="listitem">
  130. we will probably want to use smart pointers,
  131. </li>
  132. <li class="listitem">
  133. we may want several member functions to create different kinds of objects,
  134. </li>
  135. <li class="listitem">
  136. we might not necessarily need a polymorphic base class for the objects,
  137. </li>
  138. <li class="listitem">
  139. as we will see, we do not need a factory base class at all,
  140. </li>
  141. <li class="listitem">
  142. we might want to just call the constructor - without <code class="computeroutput"><span class="keyword">new</span></code>
  143. to create an object on the stack, and
  144. </li>
  145. <li class="listitem">
  146. finally we might want to use customized memory management.
  147. </li>
  148. </ul></div>
  149. <p>
  150. Experience has shown that using function objects and generic Boost components
  151. for their composition, Design Patterns that describe callback mechanisms (typically
  152. requiring a high percentage of boilerplate code with pure Object Oriented methodology)
  153. become implementable with just few code lines and without extra classes.
  154. </p>
  155. <p>
  156. Factories are callback mechanisms for constructors, so we provide two class
  157. templates, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">value_factory</span></code> and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">factory</span></code>,
  158. that encapsulate object construction via direct application of the constructor
  159. and the <code class="computeroutput"><span class="keyword">new</span></code> operator, respectively.
  160. </p>
  161. <p>
  162. We let the function objects forward their arguments to the construction expressions
  163. they encapsulate. Over this <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">factory</span></code>
  164. optionally allows the use of smart pointers and <a href="https://www.boost.org/sgi/stl/Allocators.html" target="_top">Allocators</a>.
  165. </p>
  166. <p>
  167. Compile-time polymorphism can be used where appropriate,
  168. </p>
  169. <p>
  170. </p>
  171. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  172. <span class="keyword">void</span> <span class="identifier">do_something</span><span class="special">()</span>
  173. <span class="special">{</span>
  174. <span class="comment">// [...]</span>
  175. <span class="identifier">T</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">);</span>
  176. <span class="comment">// for conceptually similar objects x we neither need virtual</span>
  177. <span class="comment">// functions nor a common base class in this context.</span>
  178. <span class="comment">// [...]</span>
  179. <span class="special">}</span>
  180. </pre>
  181. <p>
  182. </p>
  183. <p>
  184. Now, to allow inhomogeneous signatures for the constructors of the types passed
  185. in for <code class="computeroutput"><span class="identifier">T</span></code> we can use <code class="computeroutput"><span class="identifier">value_factory</span></code> and <a href="http://www.boost.org/libs/bind/bind.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code></a>
  186. to normalize between them.
  187. </p>
  188. <p>
  189. </p>
  190. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ValueFactory</span><span class="special">&gt;</span>
  191. <span class="keyword">void</span> <span class="identifier">do_something</span><span class="special">(</span><span class="identifier">ValueFactory</span> <span class="identifier">make_obj</span> <span class="special">=</span> <span class="identifier">ValueFactory</span><span class="special">())</span>
  192. <span class="special">{</span>
  193. <span class="comment">// [...]</span>
  194. <span class="keyword">typename</span> <span class="identifier">ValueFactory</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">make_obj</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">);</span>
  195. <span class="comment">// for conceptually similar objects x we neither need virtual</span>
  196. <span class="comment">// functions nor a common base class in this context.</span>
  197. <span class="comment">// [...]</span>
  198. <span class="special">}</span>
  199. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  200. <span class="special">{</span>
  201. <span class="comment">// [...]</span>
  202. <span class="identifier">do_something</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">value_factory</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;());</span>
  203. <span class="identifier">do_something</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">value_factory</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;(),</span> <span class="identifier">_1</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="identifier">_2</span><span class="special">));</span>
  204. <span class="comment">// construct X(a, b) and Y(a, 5, b), respectively.</span>
  205. <span class="comment">// [...]</span>
  206. <span class="special">}</span>
  207. </pre>
  208. <p>
  209. </p>
  210. <p>
  211. Maybe we want our objects to outlive the function's scope, in this case we
  212. have to use dynamic allocation;
  213. </p>
  214. <p>
  215. </p>
  216. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Factory</span><span class="special">&gt;</span>
  217. <span class="identifier">whatever</span> <span class="identifier">do_something</span><span class="special">(</span><span class="identifier">Factory</span> <span class="identifier">new_obj</span> <span class="special">=</span> <span class="identifier">Factory</span><span class="special">())</span>
  218. <span class="special">{</span>
  219. <span class="keyword">typename</span> <span class="identifier">Factory</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">ptr</span> <span class="special">=</span> <span class="identifier">new_obj</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">);</span>
  220. <span class="comment">// again, no common base class or virtual functions needed,</span>
  221. <span class="comment">// we could enforce a polymorphic base by writing e.g.</span>
  222. <span class="comment">// boost::shared_ptr&lt;base&gt;</span>
  223. <span class="comment">// instead of</span>
  224. <span class="comment">// typename Factory::result_type</span>
  225. <span class="comment">// above.</span>
  226. <span class="comment">// Note that we are also free to have the type erasure happen</span>
  227. <span class="comment">// somewhere else (e.g. in the constructor of this function's</span>
  228. <span class="comment">// result type).</span>
  229. <span class="comment">// [...]</span>
  230. <span class="special">}</span>
  231. <span class="comment">// [... call do_something like above but with boost::factory instead</span>
  232. <span class="comment">// of boost::value_factory]</span>
  233. </pre>
  234. <p>
  235. </p>
  236. <p>
  237. Although we might have created polymorphic objects in the previous example,
  238. we have used compile time polymorphism for the factory. If we want to erase
  239. the type of the factory and thus allow polymorphism at run time, we can use
  240. <a href="http://www.boost.org/doc/html/function.html" target="_top">Boost.Function</a>
  241. to do so. The first example can be rewritten as follows.
  242. </p>
  243. <p>
  244. </p>
  245. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">an_abstract_class</span><span class="special">*()&gt;</span> <span class="identifier">a_factory</span><span class="special">;</span>
  246. <span class="comment">// [...]</span>
  247. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  248. <span class="special">{</span>
  249. <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">a_factory</span><span class="special">&gt;</span> <span class="identifier">factories</span><span class="special">;</span>
  250. <span class="comment">// [...]</span>
  251. <span class="identifier">factories</span><span class="special">[</span><span class="string">"a_name"</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">factory</span><span class="special">&lt;</span><span class="identifier">a_concrete_class</span><span class="special">*&gt;();</span>
  252. <span class="identifier">factories</span><span class="special">[</span><span class="string">"another_name"</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">factory</span><span class="special">&lt;</span><span class="identifier">another_concrete_class</span><span class="special">*&gt;();</span>
  253. <span class="comment">// [...]</span>
  254. <span class="special">}</span>
  255. </pre>
  256. <p>
  257. </p>
  258. <p>
  259. Of course we can just as easy create factories that take arguments and/or return
  260. <a href="http://www.boost.org/libs/smart_ptr/index.html" target="_top">Smart Pointers</a>.
  261. </p>
  262. </div>
  263. <div class="section">
  264. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  265. <a name="boost_functional_factory.reference"></a><a class="link" href="index.html#boost_functional_factory.reference" title="Reference">Reference</a>
  266. </h2></div></div></div>
  267. <div class="toc"><dl class="toc">
  268. <dt><span class="section"><a href="index.html#boost_functional_factory.reference.value_factory">value_factory</a></span></dt>
  269. <dt><span class="section"><a href="index.html#boost_functional_factory.reference.factory">factory</a></span></dt>
  270. </dl></div>
  271. <div class="section">
  272. <div class="titlepage"><div><div><h3 class="title">
  273. <a name="boost_functional_factory.reference.value_factory"></a><a class="link" href="index.html#boost_functional_factory.reference.value_factory" title="value_factory">value_factory</a>
  274. </h3></div></div></div>
  275. <h5>
  276. <a name="boost_functional_factory.reference.value_factory.h0"></a>
  277. <span class="phrase"><a name="boost_functional_factory.reference.value_factory.description"></a></span><a class="link" href="index.html#boost_functional_factory.reference.value_factory.description">Description</a>
  278. </h5>
  279. <p>
  280. Function object template that invokes the constructor of the type <code class="computeroutput"><span class="identifier">T</span></code>.
  281. </p>
  282. <h5>
  283. <a name="boost_functional_factory.reference.value_factory.h1"></a>
  284. <span class="phrase"><a name="boost_functional_factory.reference.value_factory.header"></a></span><a class="link" href="index.html#boost_functional_factory.reference.value_factory.header">Header</a>
  285. </h5>
  286. <p>
  287. </p>
  288. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">functional</span><span class="special">/</span><span class="identifier">value_factory</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  289. </pre>
  290. <p>
  291. </p>
  292. <h5>
  293. <a name="boost_functional_factory.reference.value_factory.h2"></a>
  294. <span class="phrase"><a name="boost_functional_factory.reference.value_factory.synopsis"></a></span><a class="link" href="index.html#boost_functional_factory.reference.value_factory.synopsis">Synopsis</a>
  295. </h5>
  296. <p>
  297. </p>
  298. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
  299. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  300. <span class="keyword">class</span> <span class="identifier">value_factory</span><span class="special">;</span>
  301. <span class="special">}</span> <span class="comment">// boost</span>
  302. </pre>
  303. <p>
  304. </p>
  305. <div class="variablelist">
  306. <p class="title"><b>Notation</b></p>
  307. <dl class="variablelist">
  308. <dt><span class="term"><code class="computeroutput"><span class="identifier">T</span></code></span></dt>
  309. <dd><p>
  310. an arbitrary type with at least one public constructor
  311. </p></dd>
  312. <dt><span class="term"><code class="computeroutput"><span class="identifier">a0</span></code>...<code class="computeroutput"><span class="identifier">aN</span></code></span></dt>
  313. <dd><p>
  314. argument values to a constructor of <code class="computeroutput"><span class="identifier">T</span></code>
  315. </p></dd>
  316. <dt><span class="term"><code class="computeroutput"><span class="identifier">F</span></code></span></dt>
  317. <dd><p>
  318. the type <code class="computeroutput"><span class="identifier">value_factory</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;</span></code>
  319. </p></dd>
  320. <dt><span class="term"><code class="computeroutput"><span class="identifier">f</span></code></span></dt>
  321. <dd><p>
  322. an instance object of <code class="computeroutput"><span class="identifier">F</span></code>
  323. </p></dd>
  324. </dl>
  325. </div>
  326. <h5>
  327. <a name="boost_functional_factory.reference.value_factory.h3"></a>
  328. <span class="phrase"><a name="boost_functional_factory.reference.value_factory.expression_semantics"></a></span><a class="link" href="index.html#boost_functional_factory.reference.value_factory.expression_semantics">Expression
  329. Semantics</a>
  330. </h5>
  331. <div class="informaltable"><table class="table">
  332. <colgroup>
  333. <col>
  334. <col>
  335. </colgroup>
  336. <thead><tr>
  337. <th>
  338. <p>
  339. Expression
  340. </p>
  341. </th>
  342. <th>
  343. <p>
  344. Semantics
  345. </p>
  346. </th>
  347. </tr></thead>
  348. <tbody>
  349. <tr>
  350. <td>
  351. <p>
  352. <code class="computeroutput"><span class="identifier">F</span><span class="special">()</span></code>
  353. </p>
  354. </td>
  355. <td>
  356. <p>
  357. creates an object of type <code class="computeroutput"><span class="identifier">F</span></code>.
  358. </p>
  359. </td>
  360. </tr>
  361. <tr>
  362. <td>
  363. <p>
  364. <code class="computeroutput"><span class="identifier">F</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>
  365. </p>
  366. </td>
  367. <td>
  368. <p>
  369. creates an object of type <code class="computeroutput"><span class="identifier">F</span></code>.
  370. </p>
  371. </td>
  372. </tr>
  373. <tr>
  374. <td>
  375. <p>
  376. <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">a0</span></code>...<code class="computeroutput"><span class="identifier">aN</span><span class="special">)</span></code>
  377. </p>
  378. </td>
  379. <td>
  380. <p>
  381. returns <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">a0</span></code>...<code class="computeroutput"><span class="identifier">aN</span><span class="special">)</span></code>.
  382. </p>
  383. </td>
  384. </tr>
  385. <tr>
  386. <td>
  387. <p>
  388. <code class="computeroutput"><span class="identifier">F</span><span class="special">::</span><span class="identifier">result_type</span></code>
  389. </p>
  390. </td>
  391. <td>
  392. <p>
  393. is the type <code class="computeroutput"><span class="identifier">T</span></code>.
  394. </p>
  395. </td>
  396. </tr>
  397. </tbody>
  398. </table></div>
  399. <h5>
  400. <a name="boost_functional_factory.reference.value_factory.h4"></a>
  401. <span class="phrase"><a name="boost_functional_factory.reference.value_factory.limits"></a></span><a class="link" href="index.html#boost_functional_factory.reference.value_factory.limits">Limits</a>
  402. </h5>
  403. <p>
  404. Before C++11, the maximum number of arguments supported is 10. Since C++11
  405. an arbitrary number of arguments is supported.
  406. </p>
  407. </div>
  408. <div class="section">
  409. <div class="titlepage"><div><div><h3 class="title">
  410. <a name="boost_functional_factory.reference.factory"></a><a class="link" href="index.html#boost_functional_factory.reference.factory" title="factory">factory</a>
  411. </h3></div></div></div>
  412. <h5>
  413. <a name="boost_functional_factory.reference.factory.h0"></a>
  414. <span class="phrase"><a name="boost_functional_factory.reference.factory.description"></a></span><a class="link" href="index.html#boost_functional_factory.reference.factory.description">Description</a>
  415. </h5>
  416. <p>
  417. Function object template that dynamically constructs a pointee object for
  418. the type of pointer given as template argument. Smart pointers may be used
  419. for the template argument, given that <code class="computeroutput"><span class="identifier">pointer_traits</span><span class="special">&lt;</span><span class="identifier">Pointer</span><span class="special">&gt;::</span><span class="identifier">element_type</span></code>
  420. yields the pointee type.
  421. </p>
  422. <p>
  423. If an <a href="https://www.boost.org/sgi/stl/Allocators.html" target="_top">Allocator</a>
  424. is given, it is used for memory allocation and the placement form of the
  425. <code class="computeroutput"><span class="keyword">new</span></code> operator is used to construct
  426. the object. A function object that calls the destructor and deallocates the
  427. memory with a copy of the Allocator is used for the second constructor argument
  428. of <code class="computeroutput"><span class="identifier">Pointer</span></code> (thus it must
  429. be a <a href="http://www.boost.org/libs/smart_ptr/index.html" target="_top">Smart Pointer</a>
  430. that provides a suitable constructor, such as <a href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span></code></a>).
  431. </p>
  432. <p>
  433. If a third template argument is <code class="computeroutput"><span class="identifier">factory_passes_alloc_to_smart_pointer</span></code>,
  434. the allocator itself is used for the third constructor argument of <code class="computeroutput"><span class="identifier">Pointer</span></code> ( <a href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span></code></a> then uses the allocator
  435. to manage the memory of its separately allocated reference counter).
  436. </p>
  437. <h5>
  438. <a name="boost_functional_factory.reference.factory.h1"></a>
  439. <span class="phrase"><a name="boost_functional_factory.reference.factory.header"></a></span><a class="link" href="index.html#boost_functional_factory.reference.factory.header">Header</a>
  440. </h5>
  441. <p>
  442. </p>
  443. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">functional</span><span class="special">/</span><span class="identifier">factory</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  444. </pre>
  445. <p>
  446. </p>
  447. <h5>
  448. <a name="boost_functional_factory.reference.factory.h2"></a>
  449. <span class="phrase"><a name="boost_functional_factory.reference.factory.synopsis"></a></span><a class="link" href="index.html#boost_functional_factory.reference.factory.synopsis">Synopsis</a>
  450. </h5>
  451. <p>
  452. </p>
  453. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
  454. <span class="keyword">enum</span> <span class="identifier">factory_alloc_propagation</span> <span class="special">{</span>
  455. <span class="identifier">factory_alloc_for_pointee_and_deleter</span><span class="special">,</span>
  456. <span class="identifier">factory_passes_alloc_to_smart_pointer</span>
  457. <span class="special">};</span>
  458. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Pointer</span><span class="special">,</span>
  459. <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">,</span>
  460. <span class="identifier">factory_alloc_propagation</span> <span class="identifier">Policy</span> <span class="special">=</span> <span class="identifier">factory_alloc_for_pointee_and_deleter</span><span class="special">&gt;</span>
  461. <span class="keyword">class</span> <span class="identifier">factory</span><span class="special">;</span>
  462. <span class="special">}</span> <span class="comment">// boost</span>
  463. </pre>
  464. <p>
  465. </p>
  466. <div class="variablelist">
  467. <p class="title"><b>Notation</b></p>
  468. <dl class="variablelist">
  469. <dt><span class="term"><code class="computeroutput"><span class="identifier">T</span></code></span></dt>
  470. <dd><p>
  471. an arbitrary type with at least one public constructor
  472. </p></dd>
  473. <dt><span class="term"><code class="computeroutput"><span class="identifier">P</span></code></span></dt>
  474. <dd><p>
  475. pointer or smart pointer to <code class="computeroutput"><span class="identifier">T</span></code>
  476. </p></dd>
  477. <dt><span class="term"><code class="computeroutput"><span class="identifier">a0</span></code>...<code class="computeroutput"><span class="identifier">aN</span></code></span></dt>
  478. <dd><p>
  479. argument values to a constructor of <code class="computeroutput"><span class="identifier">T</span></code>
  480. </p></dd>
  481. <dt><span class="term"><code class="computeroutput"><span class="identifier">F</span></code></span></dt>
  482. <dd><p>
  483. the type <code class="computeroutput"><span class="identifier">factory</span><span class="special">&lt;</span><span class="identifier">P</span><span class="special">&gt;</span></code>
  484. </p></dd>
  485. <dt><span class="term"><code class="computeroutput"><span class="identifier">f</span></code></span></dt>
  486. <dd><p>
  487. an instance object of <code class="computeroutput"><span class="identifier">F</span></code>
  488. </p></dd>
  489. </dl>
  490. </div>
  491. <h5>
  492. <a name="boost_functional_factory.reference.factory.h3"></a>
  493. <span class="phrase"><a name="boost_functional_factory.reference.factory.expression_semantics"></a></span><a class="link" href="index.html#boost_functional_factory.reference.factory.expression_semantics">Expression
  494. Semantics</a>
  495. </h5>
  496. <div class="informaltable"><table class="table">
  497. <colgroup>
  498. <col>
  499. <col>
  500. </colgroup>
  501. <thead><tr>
  502. <th>
  503. <p>
  504. Expression
  505. </p>
  506. </th>
  507. <th>
  508. <p>
  509. Semantics
  510. </p>
  511. </th>
  512. </tr></thead>
  513. <tbody>
  514. <tr>
  515. <td>
  516. <p>
  517. <code class="computeroutput"><span class="identifier">F</span><span class="special">()</span></code>
  518. </p>
  519. </td>
  520. <td>
  521. <p>
  522. creates an object of type <code class="computeroutput"><span class="identifier">F</span></code>.
  523. </p>
  524. </td>
  525. </tr>
  526. <tr>
  527. <td>
  528. <p>
  529. <code class="computeroutput"><span class="identifier">F</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>
  530. </p>
  531. </td>
  532. <td>
  533. <p>
  534. creates an object of type <code class="computeroutput"><span class="identifier">F</span></code>.
  535. </p>
  536. </td>
  537. </tr>
  538. <tr>
  539. <td>
  540. <p>
  541. <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">a0</span></code>...<code class="computeroutput"><span class="identifier">aN</span><span class="special">)</span></code>
  542. </p>
  543. </td>
  544. <td>
  545. <p>
  546. dynamically creates an object of type <code class="computeroutput"><span class="identifier">T</span></code>
  547. using <code class="computeroutput"><span class="identifier">a0</span></code>...<code class="computeroutput"><span class="identifier">aN</span></code> as arguments for the constructor
  548. invocation.
  549. </p>
  550. </td>
  551. </tr>
  552. <tr>
  553. <td>
  554. <p>
  555. <code class="computeroutput"><span class="identifier">F</span><span class="special">::</span><span class="identifier">result_type</span></code>
  556. </p>
  557. </td>
  558. <td>
  559. <p>
  560. is the type <code class="computeroutput"><span class="identifier">P</span></code> with
  561. top-level cv-qualifiers removed.
  562. </p>
  563. </td>
  564. </tr>
  565. </tbody>
  566. </table></div>
  567. <h5>
  568. <a name="boost_functional_factory.reference.factory.h4"></a>
  569. <span class="phrase"><a name="boost_functional_factory.reference.factory.limits"></a></span><a class="link" href="index.html#boost_functional_factory.reference.factory.limits">Limits</a>
  570. </h5>
  571. <p>
  572. Before C++11, the maximum number of arguments supported is 10. Since C++11
  573. an arbitrary number of arguments is supported.
  574. </p>
  575. </div>
  576. </div>
  577. <div class="section">
  578. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  579. <a name="boost_functional_factory.changes"></a><a class="link" href="index.html#boost_functional_factory.changes" title="Changes">Changes</a>
  580. </h2></div></div></div>
  581. <h4>
  582. <a name="boost_functional_factory.changes.h0"></a>
  583. <span class="phrase"><a name="boost_functional_factory.changes.boost_1_72_0"></a></span><a class="link" href="index.html#boost_functional_factory.changes.boost_1_72_0">Boost
  584. 1.72.0</a>
  585. </h4>
  586. <p>
  587. Glen Fernandes rewrote the implementations of <code class="computeroutput"><span class="identifier">factory</span></code>
  588. and <code class="computeroutput"><span class="identifier">value_factory</span></code> to provide
  589. the following features:
  590. </p>
  591. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  592. <li class="listitem">
  593. Support r-value arguments when available
  594. </li>
  595. <li class="listitem">
  596. Support arbitrary number of arguments via variadic templates when available
  597. </li>
  598. <li class="listitem">
  599. Support allocators that are final
  600. </li>
  601. <li class="listitem">
  602. Support allocators that use fancy pointers
  603. </li>
  604. <li class="listitem">
  605. Support for disabled exceptions (<code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTIONS</span></code>)
  606. </li>
  607. <li class="listitem">
  608. Improved compilation times
  609. </li>
  610. </ul></div>
  611. <p>
  612. The following features have been removed:
  613. </p>
  614. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  615. <li class="listitem">
  616. Increasing limits for C++03 compilers through <code class="computeroutput"><span class="identifier">BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY</span></code>
  617. </li>
  618. <li class="listitem">
  619. Using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code> in place of <code class="computeroutput"><span class="keyword">void</span></code>
  620. through <code class="computeroutput"><span class="identifier">BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T</span></code>
  621. </li>
  622. </ul></div>
  623. <h4>
  624. <a name="boost_functional_factory.changes.h1"></a>
  625. <span class="phrase"><a name="boost_functional_factory.changes.boost_1_58_0"></a></span><a class="link" href="index.html#boost_functional_factory.changes.boost_1_58_0">Boost
  626. 1.58.0</a>
  627. </h4>
  628. <p>
  629. In order to remove the dependency on Boost.Optional, the default parameter
  630. for allocators has been changed from <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code>
  631. to <code class="computeroutput"><span class="keyword">void</span></code>. If you have code that
  632. has stopped working because it uses <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code>,
  633. a quick fix is to define <code class="computeroutput"><span class="identifier">BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T</span></code>,
  634. which will restore support, but this will be removed in a future release. It
  635. should be be relatively easy to fix this properly.
  636. </p>
  637. </div>
  638. <div class="section">
  639. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  640. <a name="boost_functional_factory.acknowledgements"></a><a class="link" href="index.html#boost_functional_factory.acknowledgements" title="Acknowledgements">Acknowledgements</a>
  641. </h2></div></div></div>
  642. <p>
  643. Tobias Schwinger for creating this library.
  644. </p>
  645. <p>
  646. Eric Niebler requested a function to invoke a type's constructor (with the
  647. arguments supplied as a Tuple) as a Fusion feature. These Factory utilities
  648. are a factored-out generalization of this idea.
  649. </p>
  650. <p>
  651. Dave Abrahams suggested Smart Pointer support for exception safety, providing
  652. useful hints for the implementation.
  653. </p>
  654. <p>
  655. Joel de Guzman's documentation style was copied from Fusion.
  656. </p>
  657. <p>
  658. Peter Dimov for sharing his insights on language details and their evolution.
  659. </p>
  660. </div>
  661. <div class="section">
  662. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  663. <a name="boost_functional_factory.references"></a><a class="link" href="index.html#boost_functional_factory.references" title="References">References</a>
  664. </h2></div></div></div>
  665. <div class="orderedlist"><ol class="orderedlist" type="1">
  666. <li class="listitem">
  667. <a href="http://en.wikipedia.org/wiki/Design_Patterns" target="_top">Design Patterns</a>,
  668. Gamma et al. - Addison Wesley Publishing, 1995
  669. </li>
  670. <li class="listitem">
  671. <a href="https://boost.org/sgi/stl/" target="_top">Standard Template Library Programmer's
  672. Guide</a>, Hewlett-Packard Company, 1994
  673. </li>
  674. <li class="listitem">
  675. <a href="http://www.boost.org/libs/bind/bind.html" target="_top">Boost.Bind</a>,
  676. Peter Dimov, 2001-2005
  677. </li>
  678. <li class="listitem">
  679. <a href="http://www.boost.org/doc/html/function.html" target="_top">Boost.Function</a>,
  680. Douglas Gregor, 2001-2004
  681. </li>
  682. </ol></div>
  683. </div>
  684. </div>
  685. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  686. <td align="left"><p><small>Last revised: December 10, 2019 at 00:23:31 GMT</small></p></td>
  687. <td align="right"><div class="copyright-footer"></div></td>
  688. </tr></table>
  689. <hr>
  690. <div class="spirit-nav"></div>
  691. </body>
  692. </html>