classify a user struct as an "array" or "slice"

james.p.leblanc james.p.leblanc at gmail.com
Fri Aug 20 16:19:54 UTC 2021


On Friday, 20 August 2021 at 15:38:04 UTC, Paul Backus wrote:
> 
>
> The most straightforward way would be to change your functions 
> from accepting only `T[]` to accepting either `T[]` or 
> `fakeArray`. For example:
>
> ```d
> import std.traits: isDynamicArray;
>
> // assuming `fakeArray` is a template struct/class
> enum isFakeArray(T) = is(T == fakeArray!U, U);
>
> auto foo(Array)(Array x)
>     if (isDynamicArray!Array || isFakeArray!Array)
> {
>     // ...
> }
> ```
>
> The `if (...)` part there is a [template constraint][1]. It 
> means that the template can only be instantiated when the 
> condition evaluates to `true`.
>
> [1]: https://dlang.org/spec/template.html#template_constraints

Paul,

This works like a charm!  I just implemented it ... I am most
thankful for your help again.

Next, I imagine that need to add a few "static ifs" later in the 
function
body of foo, wherein I can dig out what the element types of my
arrays are ... (I need this to initialize some summers to the 
correct
type, etc.)

These past weeks are my first attempts at using templates.  It is
impressive how powerful they are.

I have learned quite much from this forum.  But, I obviously have
quite a lot to learn.

Best Regards,
James





More information about the Digitalmars-d-learn mailing list