On 26 November 2012 15:27, monarch_dodra <monarchdodra@gmail.com> wrote:
On Monday, 26 November 2012 at 13:08:57 UTC, Manu wrote:
On Monday, 26 November 2012 at 12:46:10 UTC, Manu wrote:
On 26 November 2012 14:39, Andrej Mitrovic <andrej.mitrovich@gmail.com>**
wrote:
On 11/26/12, Manu <turkeyman@gmail.com> wrote:
> 1.Well that's certainly not intuitive. I've never even heard that term
>
> enum i = 10;
> pragma(msg, is(i == enum) || is(typeof(i) == enum)); // <-
> > false?!
>
> I can't find a way to identify that i is an enum, not a > > variable;
can not
> be assigned, has no address, etc.
It's not an enum, it's a manifest constant.
before. It looks awfully like an enum, with the whole 'enum' keyword and
all ;)
How do I detect that then?
The term enum (AFAIK) is comes from an old C++ hack, where you'd create an
actual enum to represent variable that's useable compile-time.
Anyways, when you declare an actual enumerate, you have to declare:
1) The enum type
2) The enum values
3) The enum variable
So in your case, it would have to be:
--------
enum Enumerate
{
state1 = 10,
state2
}
Enumerate i = Enumerate.state1;
-----
I'm not looking for a hot-to use enums, I need to know how to form an
expression to make the pragma show true in precisely that context.
Is see, but (unfortunatly), as already mentioned, the keyword "enum" is also used to create a manifest constant. That means the tests you are giving your i are irrelevant.
If you really want to test a manifest constant, then I guess you can test for the "lvalue-ness" of your variable:
enum i = 10;
int j = 10;
pragma(msg, __traits(compiles, (ref typeof(i) x) { } (i)));
pragma(msg, __traits(compiles, (ref typeof(j) x) { } (j)));
of the "Compile time knowability"
enum i = 10;
int j = 10;
pragma(msg, __traits(compiles, () {int[i] a;}));
pragma(msg, __traits(compiles, () {int[j] a;}));
That said, it is not an "iff" relation. I do not know of any way to test if something is *only* a manifest constant...