Problem with immutables and Template typeof(this)
AuoroP via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Dec 28 17:19:22 PST 2014
> -----Original Message-----
> From: digitalmars-d-learn at puremagic.com
> Sent: Sun, 28 Dec 2014 22:18:43 +0000
> To: digitalmars-d-learn at puremagic.com
> Subject: Re: Problem with immutables and Template typeof(this)
>
> On Sunday, 28 December 2014 at 22:07:31 UTC, AuoroP via
> Digitalmars-d-learn wrote:
>> I have been trying to figure templates out...
>>
>> template ExampleTemplate(T)
>> {
>> struct ExampleTemplate
>> {
>> T value;
>>
>> // constructor
>> auto this(T value)
>> {
>> this.value = value;
>> return this;
>> }
>
> Constructor should not have a return value.
>
Thank you!
>>
>> // opAdd
>> typeof(this) opAdd(typeof(this) that) // immutable
>> {
>> typeof(this) result;
>> result.value = this.value + that.value;
>> return result;
>> }
>> }
>> }
>>
>> alias ExampleTemplate!int Example;
>> immutable immutableEx = Example(1);
>> Example ex = Example(1);
>> Example ex2 = immutableEx + ex;
>>
>>
>> I get this error with mutbale opAdd:
>>
>> example.d(27): Error: mutable method
>> example.ExampleTemplate!int.ExampleTemplate.opAdd is not
>> callable using a immutable object
>
> This is because you can only call member functions that are
> marked with immutable, if your instance is immutable.
>
> pragma(msg, typeof(this)) will print the type of this at compile
> time.
>
Thank you, that is easier than my method:
// opDbg
typeof(this) opDbg() immutable
{
writeln( typeof(this).stringof );
return this;
}
>
>> I get this error with immutable opAdd
>> -------~-------+-------~-------=-------~-------+-------~-------
>> example.d(18): Error: cannot modify immutable expression
>> result.value
>> example.d(27): Error: template instance
>> example.ExampleTemplate!int error instantiating
>
> This is because typeof(this) is immutable.
>
>>
>> I get that typeof(this) is immutable ExampleTemplate!int.
>> I can't find any way to cast immutable away because
>> typeof(this) is the only way I know to get the type.
>
> Well, the type is ExampleTemplate. No reason not to write it
> directly. If you cannot for whatever reason I currently do not
> see: cast to Unqual!(typeof(this)).
> See http://dlang.org/phobos/std_traits.html
I tried this and it works!!! I just don't get why it works. It /is/ a type but it seems a parameter short of being useful! I definitely wouldn't have tried it on my own so I'm really thankful for that!
____________________________________________________________
FREE 3D EARTH SCREENSAVER - Watch the Earth right on your desktop!
Check it out at http://www.inbox.com/earth
More information about the Digitalmars-d-learn
mailing list