<div dir="ltr">On Mon, Oct 21, 2013 at 12:30 PM, Stephen Kelly <span dir="ltr"><<a href="mailto:steveire@gmail.com" target="_blank">steveire@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">Richard Smith wrote:<br>
<br>
> enum E1 : long {};<br>
> static_assert(std::is_same<std::underlying_type<E>::type, long>::value,<br>
> ""); // ok<br>
> static_assert(std::is_same<UnderLyingType<E>::Type, long>::value, ""); //<br>
> fails<br>
><br>
> enum E2 : char {};<br>
> static_assert(std::is_same<std::underlying_type<E>::type, char>::value,<br>
> ""); // ok<br>
> static_assert(std::is_same<UnderLyingType<E>::Type, char>::value, ""); //<br>
> fails<br>
><br>
<br>
</div>Am I right to say this? :<br>
<br>
Even if sizeof(long)==sizeof(long long), they are not the same type. The<br>
compiler intrinsic knows that, but my solution does not.<br>
<br>
Similarly, signed char, char and unsigned char are three different distinct<br>
types. The compiler knows this, but my solution does not.</blockquote><div><br></div><div>Right. This doesn't prove the non-existence of a non-intrinsic approach, though. You can probably get a lot closer by triggering integral promotion for a value of the enumeration type and then looking at the type of that value -- that should work for any unscoped enumeration type (whether or not the underlying type is fixed).</div>
<div><br></div><div>For a scoped enumeration type, I think it is not possible to determine the underlying type without compiler support, because no core language feature exposes the type.</div></div></div></div>