Optionally strongly typed array indexes

Mason McGill via Digitalmars-d digitalmars-d at puremagic.com
Wed Jun 4 11:56:42 PDT 2014


On Wednesday, 4 June 2014 at 18:46:04 UTC, Mason McGill wrote:
>   /* User code. */
>   import std.awesome_unit_library: Unit, of;
>   // Unit: defines new types that can be multiplied & divided.
>   // of: wraps a container in a stricter version, enforcing 
> units.
>
>   alias Name = Unit!"name";
>   alias Food = Unit!"food";
>   auto names = ["Fred", "Alice", "Sue"].of!Name;
>   auto foods = ["Apple", "Orange", "Tofu"].of!Food;
>
>   foreach (name; ["Bill", "Ted"].of!Name)
>   {
>       names ~= name; // This compiles happily.
>       foods ~= name; // This does not compile, preventing
>                      // Bill and Ted from being eaten.
>   }

You could actually just let the `of` template create the `Unit` 
type for you, if you want to be terse:

   import std.awesome_unit_library: of;

   auto names = ["Fred", "Alice", "Sue"].of!"name";
   auto foods = ["Apple", "Orange", "Tofu"].of!"food";

   foreach (name; ["Bill", "Ted"].of!"name")
   {
       names ~= name; // This compiles happily.
       foods ~= name; // This does not compile, preventing
                      // Bill and Ted from being eaten.
   }

It looks like this library solution puts user work at or below 
the level of your proposed syntax, though I'll have to think 
about whether it covers all the cases you're interested in.


More information about the Digitalmars-d mailing list