Function templates do implicit conversions for their arguments

Jesse Phillips Jesse.K.Phillips+D at gmail.com
Tue Jul 2 11:46:58 PDT 2013


On Tuesday, 2 July 2013 at 16:59:50 UTC, TommiT wrote:
> D
> ---
> struct Wrap(Gift)
> {
>     Gift gift;
> }
>
> struct Teddy
> {
>     int id;
>
>     Wrap!Teddy getWrapped() @property
>     {
>         return Wrap!Teddy(this);
>     }
>
>     alias getWrapped this;
> }

C++ doesn't have alias this. The behavior that it should be 
simulating is inheritance, I'd probably fail writing C++ for this 
so here is some D code to translate:

import std.stdio;

class Wrap(Gift) {
	abstract Gift gift();
}

class Teddy : Wrap!Teddy {
	int id;

	this(int i) { id = i; }

	override Teddy gift() { return this; }
}

Gift tearOpen(Gift)(Wrap!Gift wrappedGift)
{
     return wrappedGift.gift;
}

void main() {
     auto ted = new Teddy(123);
     auto r = tearOpen(ted); // NOOOO! Teddy!
     assert(r == ted); // Phew, Teddy was implicitly gift-wrapped
                       // and we tore the wrap open, not Teddy.
}


More information about the Digitalmars-d mailing list