<div dir="ltr">I agree with David.<div><br></div><div><span style="color:rgb(51,51,51);font-family:arial,sans-serif,sans;font-size:13px">I would argue for strongly typed enums to be allowed. In contrast to ordinary enums, they don't export their enumerators to the surrounding scope and they don't have implicit conversion to int. Implicit conversion to int can dangerous in that the code performs correctly but the results are unexpected. I don't think their use should be restricted to just global enumerations.</span></div><div><font color="#333333" face="arial, sans-serif, sans"><br></font></div><div><font color="#333333" face="arial, sans-serif, sans">I actually had the experience of converting old code to C++11 and when I converted the enums to strongly typed enums a whole lot of subtle faults were revealed where ints were used instead of enums. The important thing was that the old code ran perfectly but it was nearly impossible to account for the anomalous behaviour until strongly typed enums were used.</font></div><div><font color="#333333" face="arial, sans-serif, sans"><br></font></div><div><font color="#333333" face="arial, sans-serif, sans"><br></font><div class="gmail_extra">Here is a contrived example that illustrates the problem.</div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra">#include <cstdlib></div><div class="gmail_extra">#include <iostream></div><div class="gmail_extra">#include <iomanip></div><div class="gmail_extra"><br></div><div class="gmail_extra">enum bg1 {r, g, b};</div><div class="gmail_extra"><br></div><div class="gmail_extra">enum class bg2 { r, g, b };</div><div class="gmail_extra"><br></div><div class="gmail_extra">void c0(int intensity)</div><div class="gmail_extra">{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>std::cout << "Intensity: " << intensity << "\n";</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">void c1(bg1 bg, int intensity)</div><div class="gmail_extra">{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>std::cout << "Background: ";</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>switch (bg)</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>case r: std::cout << "r\n";   break;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>case g: std::cout << "gr\n"; break;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>case b: std::cout << "b\n";  break;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>}</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>std::cout << "Intensity: " << intensity << "\n";</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">void c2(bg2 bg, int intensity)</div><div class="gmail_extra">{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>std::cout << "Background: ";</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>switch (bg)</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>case bg2::r: std::cout << "r\n";   break;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>case bg2::g: std::cout << "g\n"; break;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span>case bg2::b: std::cout << "b\n";  break;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>}</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>std::cout << "Intensity: " << intensity << "\n";</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">int main()</div><div class="gmail_extra">{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>int intensity = 7;</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>c0(intensity);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>c0(bg1::r); // OK but surely an error!</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>c1(bg1::r, intensity);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>// This call is Ok as bg is implicitly converted to int.</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>// Is this what we really want?</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span>c1(bg1::r, bg1::g);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>// Strongly typed case.</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span>c2(bg2::r, intensity);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>// Because of strongly typed enums, </div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>// these will fail as bg2 is strongly typed.</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>// c0(bg2::r);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>// c2(bg2::r, bg2::g);</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>return EXIT_SUCCESS;</div><div class="gmail_extra">}</div></div><div class="gmail_extra"><br></div><div class="gmail_extra">Regards</div><div class="gmail_extra">   Andrew</div><div class="gmail_extra"><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">---------- Forwarded message ----------<br>From: David Gobbi <<a href="mailto:david.gobbi@gmail.com" target="_blank">david.gobbi@gmail.com</a>><br>To: Robert Maynard <<a href="mailto:robert.maynard@kitware.com" target="_blank">robert.maynard@kitware.com</a>><br>Cc: VTK Developers <<a href="mailto:vtk-developers@vtk.org" target="_blank">vtk-developers@vtk.org</a>>, vtk vtk <<a href="mailto:vtkusers@vtk.org" target="_blank">vtkusers@vtk.org</a>><br>Bcc: <br>Date: Mon, 27 Mar 2017 15:22:29 -0600<br>Subject: Re: [vtk-developers] [vtkusers] Allowable C++11 Features in VTK<br><div dir="ltr"><div>The fixed-type enums in C++11 could also be beneficial.  Consider the following vtkLookupTable code, which declares a few constants in the header (shown below) and then provides the definition in the .cxx file (not shown):</div><div><br></div><div>class vtkLookupTable<br></div><div>{</div><div>public:</div><div><div>  static const vtkIdType BELOW_RANGE_COLOR_INDEX;</div><div>  static const vtkIdType ABOVE_RANGE_COLOR_INDEX;</div><div>  static const vtkIdType NAN_COLOR_INDEX;</div><div>  static const vtkIdType NUMBER_OF_SPECIAL_COLORS;</div></div><div>...</div><div>};</div><div><br></div><div>In C++11 these "static const" members can be defined more efficiently as a fixed-type enum:</div><div><br></div><div>public:</div><div>  enum : vtkIdType {</div><div>    BELOW_RANGE_COLOR_INDEX = 0,</div><div>    ABOVE_RANGE_COLOR_INDEX = 1,</div><div>    NAN_COLOR_INDEX = 2,</div><div>    NUMBER_OF_SPECIAL_COLORS</div><div>  };</div><div><br></div><div>Of course VTK already uses enums for most constants (except for the ones that are still #define'd), so the benefit is for when you need a guarantee that the constant will be evaluated as a specific integral type.</div><div><br></div><div> - David</div><div><br></div><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 27, 2017 at 2:14 PM, Robert Maynard <span dir="ltr"><<a href="mailto:robert.maynard@kitware.com" target="_blank">robert.maynard@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>Thanks for the feedback. </div><div><br></div><div>1. I agree that when doing template metaprogramming, the alias keyword is significantly better than typedef. I will update the document to state that we prefer alias over typedef</div><div><br></div><div>2. I am going to update the std::array section to clarify that is preferred over raw fixed size 'C' arrays. </div><div><br></div><div>3. This is good information to have. I will add a comment to the scoped enums section while I wait for more feedback<div><div class="gmail-m_-3313909225437335678m_-2221064976619064576gmail-h5"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 27, 2017 at 3:30 PM, B B <span dir="ltr"><<a href="mailto:baljci@hotmail.com" target="_blank">baljci@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">




<div dir="ltr">
<div id="gmail-m_-3313909225437335678m_-2221064976619064576gmail-m_3755318598748279352m_2854504301224582632m_-1575733224505100624divtagdefaultwrapper" style="font-size:12pt;color:rgb(0,0,0);font-family:calibri,arial,helvetica,sans-serif" dir="ltr">
<p>I would suggest the following:</p>
<p><br>
</p>
<p>- Prefer the use of alias declarations instead of typedef: they do the same but alias declarations are better because they can be templetized (see Scott Meyers, Effective Modern C++, 63-67)</p>
<p>- Replace raw arrays with std::array when possible: they are copyable, easier to manipulate and have no extra performance costs compared to raw arrays.</p>
<p>- For scoped enums, I would restrict their use to global enums, especially in case of possible name conflicts. For nested enums, I would suggest to maintain the use of unscoped enums for two reasons: first, you don't need to write MyEnum::MyEnumValue each
 time you use them inside the class implementation; second, from my own experience, their implicit conversion to int can be useful in many cases.</p>
<div><br>
</div>
Boris<br>
<br>
<div style="color:rgb(0,0,0)">
<div>
<hr style="display:inline-block;width:98%">
<div id="gmail-m_-3313909225437335678m_-2221064976619064576gmail-m_3755318598748279352m_2854504301224582632m_-1575733224505100624x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>De :</b> vtkusers <<a href="mailto:vtkusers-bounces@vtk.org" target="_blank">vtkusers-bounces@vtk.org</a>> de la part de Robert Maynard <<a href="mailto:robert.maynard@kitware.com" target="_blank">robert.maynard@kitware.com</a>><br>
<b>Envoyé :</b> lundi 27 mars 2017 20:03<br>
<b>À :</b> VTK Developers; vtk vtk<br>
<b>Objet :</b> [vtkusers] Allowable C++11 Features in VTK</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt">
<div class="gmail-m_-3313909225437335678m_-2221064976619064576gmail-m_3755318598748279352m_2854504301224582632m_-1575733224505100624PlainText"><div><div class="gmail-m_-3313909225437335678m_-2221064976619064576gmail-m_3755318598748279352m_2854504301224582632h5">As everyone is aware over the past couple of months we have updated<br>
VTK to require a C++11 compiler, but have not explicitly stated what<br>
C++11 features are usable.<br>
<br>
We do not intend to incorporate all features of the language at this<br>
time because of incompatibilities with the structure of VTK and/or<br>
incomplete support for the features by all of the compilers that VTK<br>
aims to support.<br>
<br>
The current proposed C++11 features, and where they are allowed can be found at:<br>
<br>
<a href="https://docs.google.com/document/d/1h7wIq25d-qimQO8N9sE43fHXKKlHM2sW2ErohfHiuCg/edit?usp=sharing" id="gmail-m_-3313909225437335678m_-2221064976619064576gmail-m_3755318598748279352m_2854504301224582632m_-1575733224505100624LPlnk333734" target="_blank">https://docs.google.com/docume<wbr>nt/d/1h7wIq25d-qimQO8N9sE43fHX<wbr>KKlHM2sW2ErohfHiuCg/edit?usp=s<wbr>haring</a><br>
<br>
Over the next two weeks please provide feedback, either by commenting<br>
on the google document, or replying on the mailing list. Once the two<br>
weeks are over, we will integrate the result into the existing coding<br>
documentation, and then allow C++11 to be used.<br></div></div></div></span></font></div></div></div></blockquote></div></div></div></div></div></div></blockquote></div><br></div></div>
<br>______________________________<wbr>_________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensou<wbr>rce/opensource.html</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtk-developers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=<wbr>vtk-developers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtk-developers" rel="noreferrer" target="_blank">http://public.kitware.com/mail<wbr>man/listinfo/vtk-developers</a><br></blockquote></div><br clear="all"><div><br></div>-- <br><div class="gmail-m_-3313909225437335678gmail_signature">______________________________<wbr>_____________<br>Andrew J. P. Maclean<br><br>______________________________<wbr>_____________</div>
</div></div></div>