Create custom data types

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Apr 29 16:16:48 PDT 2015


On 04/29/2015 03:48 PM, Dennis Ritchie wrote:

> Thanks. And how can I stop all attempts to perform actions
> arifmiticheskih the type int? Ie action to "t += b;" suppressed to compile.

Some operator overloading is needed. I am pretty sure someone must have 
implemented such a type. What I add below probably addresses just what 
you ask. I would like to see others chime in with their solutions or 
potentially the solutions that are already in Phobos.

Continued inline...

>
> -----
> import std.exception, std.stdio;
>
> struct CustomInteger(T, T minValue, T maxValue)
> {
>      T value_;
>
>      alias value this;
>
>      @property T value() const
>      {
>          enforce((value_ >= minValue) &&
>              (value_ <= maxValue));
>
>          return value_;
>      }
>
>      @property void value(T v)
>      {
>          value_ = v;
>      }

Add this:

     ref CustomInteger opOpAssign(string op, T2)(T2 rhs)
     {
         static if (is (T2 == CustomInteger)) {
             mixin("value_ " ~ op ~ "= rhs.value_;");
             return this;

         } else {
             return this.opOpAssign!(op, CustomInteger)(CustomInteger(rhs));
         }
     }


> }
>
> void main()
> {
>      alias Balance = CustomInteger!(int, -32_000, 32_000);
>
>      auto b = Balance(42);
>
>      // b += 5; // Error: 'b += 5' is not a scalar,
>      // it is a CustomInteger!(int, -32000, 32000)

Now this works:

     b += 5;
     assert(b == 47);

     b += b;
     assert(b == 94);


>
>      int t = 4;
>
>      t += b; // OK
>
>      writeln(b); // prints 46
> }

Ali



More information about the Digitalmars-d-learn mailing list