typedefs are useless

Peter C. Chapin pchapin at sover.net
Mon Dec 3 16:53:25 PST 2007


Steven Schveighoffer wrote:

> Let's say I want a way to create a type that's like a long, but is not 
> implicitly convertable from a long.
> 
> I can do:
> 
> typedef long mytype;
> 
> However, I can't create literals of this type.  so if I want to initialize a 
> mytype value to 6, I have to do:
> 
> mytype x = cast(mytype)6L;

FWIW, Ada solves this problem by considering literals in a special type
called "universal integer." It's special because you can't actually
declare any variables of that type. However, universal integers can be
implicitly converted to other types derived from Integer. So, in Ada it
looks like this

type My_Type is range 0..10    -- Or whatever range you need.

X : My_Type;
Y : Integer;

...

X := Y;    -- Type mismatch. Compile error.
X := 1;    -- Fine. Universal integer converts to My_Type.

This sounds like what you want for D. Note, by the way, that the range
constraint on a type definition in Ada must be static. Thus the compiler
can always tell if the value of the universal integer (which can only be
a literal) is in the right range.

Ada also has a concept of universal float to deal with float point
literals in a similar way.

Peter



More information about the Digitalmars-d mailing list