You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>This example also illustrates that bit fields are not beyond the reach of this proposal.</p>
638
+
<h2data-number="2.3" id="enum-to-string"><spanclass="header-section-number">2.3</span> Enum to String<ahref="#enum-to-string" class="self-link"></a></h2>
639
+
<p>One of the most commonly requested facilities is to convert an enum value to a string (this example relies on expansion statements <spanclass="citation" data-cites="P1306R1">[<ahref="#ref-P1306R1" role="doc-biblioref">P1306R1</a>]</span>):</p>
<spanid="cb4-4"><ahref="#cb4-4"></a><spanclass="kw">template</span><spanclass="cf">for</span><spanclass="op">(</span><spanclass="kw">constexpr</span><spanclass="kw">auto</span> e <spanclass="op">:</span> std<spanclass="op">::</span>meta<spanclass="op">::</span>members_of<spanclass="op">(^</span>E<spanclass="op">))</span><spanclass="op">{</span></span>
<spanid="cb5-4"><ahref="#cb5-4"></a><spanclass="kw">template</span><spanclass="cf">for</span><spanclass="op">(</span><spanclass="kw">constexpr</span><spanclass="kw">auto</span> e <spanclass="op">:</span> std<spanclass="op">::</span>meta<spanclass="op">::</span>members_of<spanclass="op">(^</span>E<spanclass="op">))</span><spanclass="op">{</span></span>
<li><codeclass="sourceCode cpp"><spanclass="op">[:</span>r<spanclass="op">:]::</span></code> produces a <em>nested-name-specifier</em> corresponding to the namespace, enumeration type, or class type represented by <codeclass="sourceCode cpp">r</code>.</li>
667
701
</ul>
668
702
<p>Attempting to splice a reflection value that does not meet the requirement of the splice (including “invalid reflections”) is ill-formed. For example: :::bq</p>
669
-
<divclass="sourceCode" id="cb4"><preclass="sourceCode cpp"><codeclass="sourceCode cpp"><spanid="cb4-1"><ahref="#cb4-1"></a><spanclass="kw">typename</span><spanclass="op">[:</span><spanclass="op">^::</span><spanclass="op">:]</span> x <spanclass="op">=</span><spanclass="dv">0</span>; <spanclass="co">// Error.</span></span></code></pre></div>
703
+
<divclass="sourceCode" id="cb6"><preclass="sourceCode cpp"><codeclass="sourceCode cpp"><spanid="cb6-1"><ahref="#cb6-1"></a><spanclass="kw">typename</span><spanclass="op">[:</span><spanclass="op">^::</span><spanclass="op">:]</span> x <spanclass="op">=</span><spanclass="dv">0</span>; <spanclass="co">// Error.</span></span></code></pre></div>
670
704
<p>::: A quality implementation should emit the diagnostic text associated with an invalid reflection when attempting to splice that invalid reflection.</p>
<spanid="cb5-2"><ahref="#cb5-2"></a><spanclass="kw">namespace</span> meta <spanclass="op">{</span></span>
675
-
<spanid="cb5-3"><ahref="#cb5-3"></a><spanclass="kw">using</span> info <spanclass="op">=</span><spanclass="kw">decltype</span><spanclass="op">(^</span><spanclass="dt">int</span><spanclass="op">)</span>;</span>
<spanid="cb7-2"><ahref="#cb7-2"></a><spanclass="kw">namespace</span> meta <spanclass="op">{</span></span>
709
+
<spanid="cb7-3"><ahref="#cb7-3"></a><spanclass="kw">using</span> info <spanclass="op">=</span><spanclass="kw">decltype</span><spanclass="op">(^</span><spanclass="dt">int</span><spanclass="op">)</span>;</span>
<p>In our initial proposal a value of type <codeclass="sourceCode cpp">std<spanclass="op">::</span>meta<spanclass="op">::</span>info</code> can represent:</p>
679
713
<ul>
680
714
<li>an error (corresponding to an “invalid reflection”)</li>
<p>Notably absent at this time are general non-constant expressions (that aren’t <em>expression-id</em>s referring to variables or structured bindings). For example:</p>
690
724
<blockquote>
691
-
<divclass="sourceCode" id="cb6"><preclass="sourceCode cpp"><codeclass="sourceCode cpp"><spanid="cb6-1"><ahref="#cb6-1"></a><spanclass="dt">int</span> x <spanclass="op">=</span><spanclass="dv">0</span>;</span>
<spanid="cb6-3"><ahref="#cb6-3"></a><spanclass="op">[:^</span>x<spanclass="op">:]</span><spanclass="op">=</span><spanclass="dv">42</span>; <spanclass="co">// Okay. Same as: x = 42;</span></span>
694
-
<spanid="cb6-4"><ahref="#cb6-4"></a> x <spanclass="op">=</span><spanclass="op">[:^(</span><spanclass="dv">2</span><spanclass="op">*</span>x<spanclass="op">):]</span>; <spanclass="co">// Error: "2*x" is a general non-constant expression.</span></span>
695
-
<spanid="cb6-5"><ahref="#cb6-5"></a><spanclass="kw">constexpr</span><spanclass="dt">int</span> N <spanclass="op">=</span><spanclass="dv">42</span>;</span>
696
-
<spanid="cb6-6"><ahref="#cb6-6"></a> x <spanclass="op">=</span><spanclass="op">[:^(</span><spanclass="dv">2</span><spanclass="op">*</span>N<spanclass="op">):]</span>; <spanclass="co">// Okay: "2*N" is a constant-expression.</span></span>
<spanid="cb8-3"><ahref="#cb8-3"></a><spanclass="op">[:^</span>x<spanclass="op">:]</span><spanclass="op">=</span><spanclass="dv">42</span>; <spanclass="co">// Okay. Same as: x = 42;</span></span>
728
+
<spanid="cb8-4"><ahref="#cb8-4"></a> x <spanclass="op">=</span><spanclass="op">[:^(</span><spanclass="dv">2</span><spanclass="op">*</span>x<spanclass="op">):]</span>; <spanclass="co">// Error: "2*x" is a general non-constant expression.</span></span>
729
+
<spanid="cb8-5"><ahref="#cb8-5"></a><spanclass="kw">constexpr</span><spanclass="dt">int</span> N <spanclass="op">=</span><spanclass="dv">42</span>;</span>
730
+
<spanid="cb8-6"><ahref="#cb8-6"></a> x <spanclass="op">=</span><spanclass="op">[:^(</span><spanclass="dv">2</span><spanclass="op">*</span>N<spanclass="op">):]</span>; <spanclass="co">// Okay: "2*N" is a constant-expression.</span></span>
<p>Note that for <codeclass="sourceCode cpp"><spanclass="op">^(</span><spanclass="dv">2</span><spanclass="op">*</span>N<spanclass="op">)</span></code> an implementation only has to capture the constant value of <codeclass="sourceCode cpp"><spanclass="dv">2</span><spanclass="op">*</span>N</code> and not various other properties of the underlying expression (such as any temporaries it involves, etc.).</p>
700
734
<p>The type <codeclass="sourceCode cpp">std<spanclass="op">::</span>meta<spanclass="op">::</span>info</code> is a <em>scalar</em> type. Nontype template arguments of type <codeclass="sourceCode cpp">std<spanclass="op">::</span>meta<spanclass="op">::</span>info</code> are permitted. The entity being reflected can affect the linkage of a template instance involving a reflection. For example:</p>
701
735
<blockquote>
702
-
<divclass="sourceCode" id="cb7"><preclass="sourceCode cpp"><codeclass="sourceCode cpp"><spanid="cb7-1"><ahref="#cb7-1"></a><spanclass="kw">template</span><spanclass="op"><</span><spanclass="kw">auto</span> R<spanclass="op">></span><spanclass="kw">struct</span> S <spanclass="op">{}</span>;</span>
<spanid="cb7-6"><ahref="#cb7-6"></a>S<spanclass="op"><^</span>x<spanclass="op">></span> sx; <spanclass="co">// S<^x> has external name linkage.</span></span>
708
-
<spanid="cb7-7"><ahref="#cb7-7"></a>S<spanclass="op"><^</span>y<spanclass="op">></span> sy; <spanclass="co">// S<^y> has internal name linkage.</span></span></code></pre></div>
736
+
<divclass="sourceCode" id="cb9"><preclass="sourceCode cpp"><codeclass="sourceCode cpp"><spanid="cb9-1"><ahref="#cb9-1"></a><spanclass="kw">template</span><spanclass="op"><</span><spanclass="kw">auto</span> R<spanclass="op">></span><spanclass="kw">struct</span> S <spanclass="op">{}</span>;</span>
<spanid="cb9-6"><ahref="#cb9-6"></a>S<spanclass="op"><^</span>x<spanclass="op">></span> sx; <spanclass="co">// S<^x> has external name linkage.</span></span>
742
+
<spanid="cb9-7"><ahref="#cb9-7"></a>S<spanclass="op"><^</span>y<spanclass="op">></span> sy; <spanclass="co">// S<^y> has internal name linkage.</span></span></code></pre></div>
709
743
</blockquote>
710
744
<p>Namespace <codeclass="sourceCode cpp">std<spanclass="op">::</span>meta</code> is associated with type <codeclass="sourceCode cpp">std<spanclass="op">::</span>meta<spanclass="op">::</span>info</code>: That allows the core meta functions to be invoked without explicit qualification. For example:</p>
0 commit comments