2
0
mirror of https://github.com/boostorg/pfr.git synced 2026-01-28 19:32:12 +00:00
Files
pfr/index.html
Antony Polukhin 10d54d5f7d docs regenerated
2020-10-05 20:00:13 +03:00

374 lines
27 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 1. Boost.PFR 1.0</title>
<link rel="stylesheet" href="http://www.boost.org/doc/libs/1_63_0/doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="index.html" title="Chapter 1. Boost.PFR 1.0">
<link rel="next" href="boost_pfr/short_examples_for_the_impatient.html" title="Short Examples for the Impatient">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="http://www.boost.org/doc/libs/1_63_0/boost.png"></td>
<td align="center"><a href="http://www.boost.org/doc/libs/1_63_0/index.html">Home</a></td>
<td align="center"><a href="http://www.boost.org/doc/libs/1_63_0/libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="http://www.boost.org/doc/libs/1_63_0/more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav"><a accesskey="n" href="boost_pfr/short_examples_for_the_impatient.html"><img src="http://www.boost.org/doc/libs/1_63_0/doc/src/images/next.png" alt="Next"></a></div>
<div class="chapter">
<div class="titlepage"><div>
<div><h2 class="title">
<a name="boost_pfr"></a>Chapter 1. Boost.PFR 1.0</h2></div>
<div><p class="copyright">Copyright © 2016-2020 Antony Polukhin</p></div>
<div><div class="legalnotice">
<a name="boost_pfr.legal"></a><p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>)
</p>
</div></div>
</div></div>
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro">Motivation and Intro</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.why_tuples_are_bad_and_aggregate">Why
tuples are bad and aggregates are more preferable?</a></span></dt>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.sample_with_db">Sample
with DB</a></span></dt>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.representations">Representations</a></span></dt>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.out_of_the_box_functionality">Out
of the box functionality </a></span></dt>
</dl></dd>
<dt><span class="section"><a href="boost_pfr/short_examples_for_the_impatient.html">Short Examples
for the Impatient</a></span></dt>
<dt><span class="section"><a href="boost_pfr/tutorial.html">Tutorial</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="boost_pfr/tutorial.html#boost_pfr.tutorial.accessing_structure_member_by_in">Accessing
structure member by index</a></span></dt>
<dt><span class="section"><a href="boost_pfr/tutorial.html#boost_pfr.tutorial.custom_printing_of_aggregates">Custom
printing of aggregates</a></span></dt>
<dt><span class="section"><a href="boost_pfr/tutorial.html#boost_pfr.tutorial.flattening">Flattening</a></span></dt>
<dt><span class="section"><a href="boost_pfr/tutorial.html#boost_pfr.tutorial.should_i_use_flat_or_precise_fun">Should
I use Flat or Precise functions?</a></span></dt>
<dt><span class="section"><a href="boost_pfr/tutorial.html#boost_pfr.tutorial.three_ways_of_getting_operators">Three
ways of getting operators </a></span></dt>
<dt><span class="section"><a href="boost_pfr/tutorial.html#boost_pfr.tutorial.reflection_of_unions">Reflection of
unions </a></span></dt>
</dl></dd>
<dt><span class="section"><a href="boost_pfr/configuration_macro.html">Configuration Macro</a></span></dt>
<dt><span class="section"><a href="boost_pfr/limitations.html">Limitations</a></span></dt>
<dt><span class="section"><a href="boost_pfr/how_it_works.html">How it works</a></span></dt>
<dt><span class="section"><a href="boost_pfr/acknowledgements.html">Acknowledgements</a></span></dt>
<dt><span class="section"><a href="boost_pfr/reference.html">Reference</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="boost_pfr/reference.html#precise_reflection">Precise Reflection</a></span></dt>
<dt><span class="section"><a href="boost_pfr/reference.html#flat_reflection">Flat Reflection</a></span></dt>
<dt><span class="section"><a href="boost_pfr/reference.html#include_all">Include all</a></span></dt>
</dl></dd>
</dl>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_pfr.motivation_and_intro"></a><a class="link" href="index.html#boost_pfr.motivation_and_intro" title="Motivation and Intro">Motivation and Intro</a>
</h2></div></div></div>
<div class="toc"><dl>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.why_tuples_are_bad_and_aggregate">Why
tuples are bad and aggregates are more preferable?</a></span></dt>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.sample_with_db">Sample
with DB</a></span></dt>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.representations">Representations</a></span></dt>
<dt><span class="section"><a href="index.html#boost_pfr.motivation_and_intro.out_of_the_box_functionality">Out
of the box functionality </a></span></dt>
</dl></div>
<p>
Boost.Precise and Flat tuple Representation (Boost.PFR) is a library for very
basic reflection that gives you access to structure elements by index and provides
other <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span></code> like methods for user defined types
without any macro or boilerplate code.
</p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_pfr.motivation_and_intro.why_tuples_are_bad_and_aggregate"></a><a class="link" href="index.html#boost_pfr.motivation_and_intro.why_tuples_are_bad_and_aggregate" title="Why tuples are bad and aggregates are more preferable?">Why
tuples are bad and aggregates are more preferable?</a>
</h3></div></div></div>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span></code> and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span></code>
are great for generic programming, however they have disadvantages. First
of all, code that uses them becomes barely readable. Consider two definitions:
</p>
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">auth_info_tuple</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span><span class="special">,</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span><span class="special">,</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span><span class="special">,</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">time_t</span>
<span class="special">&gt;;</span>
<span class="keyword">struct</span> <span class="identifier">auth_info_aggreagte</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span> <span class="identifier">id</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span> <span class="identifier">session_id</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span> <span class="identifier">source_id</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">time_t</span> <span class="identifier">valid_till</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<p>
Definition via structure is much more clear. Same story with usages: <code class="computeroutput"><span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">value</span><span class="special">);</span></code> vs. <code class="computeroutput"><span class="keyword">return</span>
<span class="identifier">value</span><span class="special">.</span><span class="identifier">session_id</span><span class="special">;</span></code>.
</p>
<p>
Another advantage of aggregates is a more efficient copy, move construction
and assignments.
</p>
<p>
Because of the above issues many guidelines recommend to <span class="bold"><strong>use
aggregates instead of tuples</strong></span>. However aggregates fail when it
comes to the functional like programming.
</p>
<p>
PFR library <span class="bold"><strong>provides tuple like methods for aggregate
initializable structures</strong></span>, making aggregates usable in contexts
where only tuples were useful.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="http://www.boost.org/doc/libs/1_63_0/doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top">
<p>
All you have to do is to add <code class="computeroutput"><span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">pfr</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
</p>
<p>
No macro or other type/member registrations required.
</p>
</td></tr>
</table></div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_pfr.motivation_and_intro.sample_with_db"></a><a class="link" href="index.html#boost_pfr.motivation_and_intro.sample_with_db" title="Sample with DB">Sample
with DB</a>
</h3></div></div></div>
<p>
Imagine that you are writing the wrapper library for database. User of your
library wish to implement <code class="computeroutput"><span class="identifier">retrieve_friend</span></code>
function:
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">db</span><span class="special">/</span><span class="identifier">api</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// your library</span>
<span class="comment">// User code:</span>
<span class="keyword">struct</span> <span class="identifier">user_info</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span> <span class="identifier">id</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span> <span class="identifier">github_stars</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">email</span><span class="special">;</span>
<span class="special">};</span>
<span class="comment">// ...</span>
<span class="identifier">user_info</span> <span class="identifier">retrieve_friend</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string_view</span> <span class="identifier">name</span><span class="special">);</span>
</pre>
<p>
Depending on the usage of PFR in your DB wrapper users code will look differently:
</p>
<div class="informaltable">
<a name="boost_pfr.motivation_and_intro.sample_with_db.quick_examples"></a><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Without PFR
</p>
</th>
<th>
<p>
With PFR
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">user_info</span> <span class="identifier">retrieve_friend</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string_view</span> <span class="identifier">name</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">auto</span> <span class="identifier">tuple_info</span> <span class="special">=</span> <span class="identifier">db</span><span class="special">::</span><span class="identifier">one_row_as</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">int64_t</span><span class="special">&gt;(</span>
<span class="string">"SELECT id, name, github_stars, email FROM user_infos WHERE name=$0"</span><span class="special">,</span>
<span class="identifier">name</span>
<span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">friend_info</span> <span class="special">=</span> <span class="identifier">ask_user_for_friend</span><span class="special">(</span>
<span class="identifier">user_info</span><span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">tuple_info</span><span class="special">)),</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">tuple_info</span><span class="special">)),</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">tuple_info</span><span class="special">)),</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">3</span><span class="special">&gt;(</span><span class="identifier">tuple_info</span><span class="special">)),</span>
<span class="special">}</span>
<span class="special">);</span>
<span class="identifier">db</span><span class="special">::</span><span class="identifier">insert</span><span class="special">(</span>
<span class="string">"INSERT INTO user_infos(id, name, github_stars, email) VALUES ($0, $1, $2, $3)"</span><span class="special">,</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">friend_info</span><span class="special">)),</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">friend_info</span><span class="special">)),</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">friend_info</span><span class="special">)).</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">3</span><span class="special">&gt;(</span><span class="identifier">friend_info</span><span class="special">))</span>
<span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">friend_info</span><span class="special">;</span>
<span class="special">}</span>
</pre>
</td>
<td>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">user_info</span> <span class="identifier">retrieve_friend</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string_view</span> <span class="identifier">name</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">const</span> <span class="keyword">auto</span> <span class="identifier">info</span> <span class="special">=</span> <span class="identifier">db</span><span class="special">::</span><span class="identifier">one_row_as</span><span class="special">&lt;</span><span class="identifier">user_info</span><span class="special">&gt;(</span>
<span class="string">"SELECT id, name, github_stars, email FROM user_infos WHERE name=$0"</span><span class="special">,</span>
<span class="identifier">name</span>
<span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">friend_info</span> <span class="special">=</span> <span class="identifier">ask_user_for_friend</span><span class="special">(</span><span class="identifier">info</span><span class="special">);</span>
<span class="identifier">db</span><span class="special">::</span><span class="identifier">insert</span><span class="special">(</span>
<span class="string">"INSERT INTO user_infos(id, name, github_stars, email) VALUES ($0, $1, $2, $3)"</span><span class="special">,</span>
<span class="identifier">friend_info</span>
<span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">friend_info</span><span class="special">;</span>
<span class="special">}</span>
</pre>
</td>
</tr></tbody>
</table>
</div>
<p>
With PFR the code is shorter, more readable and more pleasant to write.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_pfr.motivation_and_intro.representations"></a><a class="link" href="index.html#boost_pfr.motivation_and_intro.representations" title="Representations">Representations</a>
</h3></div></div></div>
<p>
The two different types of reflection are:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<span class="bold"><strong>Precise</strong></span> tuple representation, where
each field type is represented as it actually exists, even if the type
is itself a user-defined type.
</li>
<li class="listitem">
<span class="bold"><strong>Flat</strong></span> tuple representation, where user-defined
types are represented by their individual field types, and all other
types are represented as they actually exists.
</li>
</ul></div>
<p>
As an example:
</p>
<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">pfr</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">nested_t</span> <span class="special">{</span> <span class="keyword">char</span> <span class="identifier">c</span><span class="special">;</span> <span class="special">};</span>
<span class="keyword">struct</span> <span class="identifier">foo_t</span> <span class="special">{</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span> <span class="identifier">nested_t</span> <span class="identifier">nested</span><span class="special">;</span> <span class="special">};</span>
<span class="keyword">static_assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_same</span><span class="special">&lt;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">pfr</span><span class="special">::</span><span class="identifier">flat_tuple_element_t</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="identifier">foo_t</span><span class="special">&gt;,</span> <span class="comment">// Flat reflection.</span>
<span class="keyword">char</span> <span class="comment">// `char`, not `nested_t`!</span>
<span class="special">&gt;::</span><span class="identifier">value</span><span class="special">,</span> <span class="string">""</span><span class="special">);</span>
<span class="comment">// Requires C++17 or Loophole enabled:</span>
<span class="keyword">static_assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_same</span><span class="special">&lt;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">pfr</span><span class="special">::</span><span class="identifier">tuple_element_t</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="identifier">foo_t</span><span class="special">&gt;,</span> <span class="comment">// Precise reflection.</span>
<span class="identifier">nested_t</span>
<span class="special">&gt;::</span><span class="identifier">value</span><span class="special">,</span> <span class="string">""</span><span class="special">);</span>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_pfr.motivation_and_intro.out_of_the_box_functionality"></a><a class="link" href="index.html#boost_pfr.motivation_and_intro.out_of_the_box_functionality" title="Out of the box functionality">Out
of the box functionality </a>
</h3></div></div></div>
<p>
Boost.Precise and Flat tuple Representation (Boost.PFR) adds the following
out-of-the-box functionality for aggregate initializable structures:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
comparison operators
</li>
<li class="listitem">
heterogeneous comparators
</li>
<li class="listitem">
hash
</li>
<li class="listitem">
stream operators
</li>
<li class="listitem">
access to members by index
</li>
<li class="listitem">
member type retrieval
</li>
<li class="listitem">
methods for cooperation with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span></code>
</li>
<li class="listitem">
methods to visit each field of the structure
</li>
</ul></div>
<p>
PFR is a header only library that does not depend on Boost. You can just
copy the content of the "include" folder <a href="https://github.com/apolukhin/magic_get" target="_top">from
the github</a> into your project, and the library will work fine.
</p>
</div>
<div class="warning"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="http://www.boost.org/doc/libs/1_63_0/doc/src/images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>
This is not an official Boost library! It wasn't reviewed and can't be downloaded
from www.boost.org. This library is available to the community to know real
interest and get comments for refinement. The intention is to submit library
to formal review, if community think that it is interesting!
</p></td></tr>
</table></div>
<div class="caution"><table border="0" summary="Caution">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="http://www.boost.org/doc/libs/1_63_0/doc/src/images/caution.png"></td>
<th align="left">Caution</th>
</tr>
<tr><td align="left" valign="top"><p>
Recommended C++ Standards are C++17 and above
</p></td></tr>
</table></div>
<div class="caution"><table border="0" summary="Caution">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="http://www.boost.org/doc/libs/1_63_0/doc/src/images/caution.png"></td>
<th align="left">Caution</th>
</tr>
<tr><td align="left" valign="top"><p>
Library requires at least C++14! Pre C++14 compilers (C++11, C++03...) are
not supported
</p></td></tr>
</table></div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"><p><small>Last revised: October 05, 2020 at 16:56:42 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td>
</tr></table>
<hr>
<div class="spirit-nav"><a accesskey="n" href="boost_pfr/short_examples_for_the_impatient.html"><img src="http://www.boost.org/doc/libs/1_63_0/doc/src/images/next.png" alt="Next"></a></div>
</body>
</html>