__traits(isSame, TemplateOf ...) errors and some Idiomatic D questions

Seb seb at wilzba.ch
Mon Jan 8 23:14:32 UTC 2018


On Monday, 8 January 2018 at 22:59:44 UTC, aliak wrote:
> Hi, trying to write some idiomatic generic D code and I'm a bit 
> stuck with using the TemplateOf to check if a range is a 
> SortedRange or not. A bit about the code, I'm basically 
> rewriting 
> https://dlang.org/library/std/algorithm/setops/set_difference.html but I want to do different things based on if the passed in ranges are sorted or not.
>
> The error I'm getting is this:
>
> onlineapp.d(61): Error: template std.traits.TemplateOf does not 
> match any template declaration. And I use it like this:
>
> enum r1Sorted = __traits(isSame, TemplateOf!(R1), SortedRange);
>
> That's happening on line 61 and the weird thing is that I'm 
> using TemplateOf exactly (i think) the same way on lines 28 and 
> 29 and those do not error.
>
> The code is here: https://run.dlang.io/is/9fowuP
>
> If I substitute the isSame trait with compiles, then it works:
>
> enum r1Sorted = __traits(compiles, TemplateOf!(R1), 
> SortedRange);
> pragma(msg, r1Sorted); // prints true
>
> Any help would be appreciated! And on a side note, if anyone 
> can point out any things I'm doing wrong when it comes to using 
> D optimally/properly then please do.
>
> Cheers! And thanks for any help!
>
> PS:
>
> 1) Is there a better way to check if a predicate is unary or 
> binary?
> 2) Is there an idiomatic way to check if a range is sortable or 
> is it just "is(typeof(sort(range)))" basically it?

Why don't you use the `is` Expression?
https://wiki.dlang.org/Is_expression
It has the handy advantage that it will return false on compile 
errors.

is(TemplateOf!(typeof(r1)) == SortedRange);

With your example:

https://run.dlang.io/is/x2JWjI

Your problem is that `TemplateOf!(int[])` isn't defined. It 
should probably be changed to return `void`.


More information about the Digitalmars-d-learn mailing list