Logical const

Max Samukha spambox at d-coding.com
Mon Nov 29 13:22:55 PST 2010


On 11/29/2010 08:58 PM, Steven Schveighoffer wrote:
> Most likely not.  How do you say that the 'draw' function switches the
> widget to a different parameterized type?  With const, you can just slap
> a const on the end of the function.
>
> Here is some example of what I mean:
>
> class Widget
> {
>     mutable Window location;
>     int x, y, width, height;
>     void draw() const { location.drawRectangle(x, y, width, height); }
> }
>
> where Window.drawRectangle is not a const function.
>
> -Steve

I think we could try to devise a library solution. For example, the 
problem could be solved with a templated struct + "alias this", provided 
bugs in "alias this" are fixed. The following code works even with the 
current implementation (dmd 2.050):

struct Mutable(T)
{
     T value;

     @property ref Unqual!T mutable() const
     {
         auto p = cast(Unqual!T*)&value;
         return *p;
     }
     alias mutable this;

     ref opAssign(U)(auto ref U v) const
     {
         return mutable() = v;
     }
}

class Window
{
     void drawRectangle(int x, int y, int width, int height)
     {
         writeln("Draw");
     }
}

class C
{
     int x, y, width, height;
     Mutable!Window location;

     this()
     {
         location = new Window;
     }

     void draw() const { location.drawRectangle(x, y, width, height); }
}

void main()
{
     const C c = new C;
     c.draw();
}

(opAssign shouldn't be necessary. The compiler should properly forward 
the assignment operation to the value returned by "mutable")



More information about the Digitalmars-d mailing list