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

Paul Backus snarwin at gmail.com
Fri Aug 20 15:38:04 UTC 2021


On Friday, 20 August 2021 at 15:12:25 UTC, james.p.leblanc wrote:
> Greetings,
>
> I have a user created struct, let's call this "**fakeArray**":
>
> For all intents and purposes fakeArray behaves like an array 
> (or slice, I guess).
> (i.e. It has a number of operator overloadings, and *foreach* 
> extensions implemented.)
>
> I have a fairly large number of function in a module that 
> accept arrays (or slices).
>
> These are implemented as:
>
> **auto foo(T)(T[] x) { ... }**
>
> So, foo will accept "official" arrays and slices.
>
> What is the easiest way to coerce all my functions to also
> accept my fakeArray?

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


More information about the Digitalmars-d-learn mailing list