On Sat, Feb 24, 2018 at 02:54:13AM +0000, Jonathan via Digitalmars-d-learn 
> I am having trouble finding many useful explanations of using template
> constraints beyond basic usage.
> I would like to have a template constrant to enforce that a type can
> be explicitly cast to another type:
>     void (T)(T t)
>             if (cast(int) T)//force `cast(int) T` to be possible
>         {
>             // Yay I know `t` can be cast to an `int`!
>     }
> Is this possible?


        void (T)(T t)
        if (is(typeof(cast(int) T.init)))


- is(X) generally means "is X a valid type?". It's the usual way of
  testing whether something is valid, because an invalid expression will
  have no type, and is(X) will return false for it.

- To make use of is(X), generally you want to use typeof to extract the
  type of some test expression.

- T.init is the usual D way of saying "give me an instance of type T",
  because every type has an .init.

- Putting it together, we have our test object T.init, and our test
  expression `cast(int) T.init`, extract the type of that using typeof,
  and use the is(...) operator to test whether that type exists.


I think Debian's doing something wrong, `apt-get install pesticide', doesn't 
seem to remove the bugs on my system! -- Mike Dresser

Reply via email to