Thread overview
Forwarding Uncopyable Static Array Elements
Sep 17, 2017
Nordlöw
Sep 17, 2017
Nordlöw
Sep 17, 2017
Nordlöw
September 17, 2017
How can

T[n] asStatic(T, size_t n)(T[n] arr)
{
    import std.traits : isCopyable;
    static if (isCopyable!T)
    {
        return arr;
    }
    else
    {
        static assert(false, "TODO support forwarding of uncopyable elements");
    }
}

be extended to support uncopyable element types?
September 17, 2017
On Sunday, 17 September 2017 at 13:00:04 UTC, Nordlöw wrote:
> How can
>
> ...
>
> be extended to support uncopyable element types?

That is, when `T` is uncopyable.
September 17, 2017
On Sunday, 17 September 2017 at 13:00:04 UTC, Nordlöw wrote:
> How can
>
> T[n] asStatic(T, size_t n)(T[n] arr)
> {
>     import std.traits : isCopyable;
>     static if (isCopyable!T)
>     {
>         return arr;
>     }
>     else
>     {
>         static assert(false, "TODO support forwarding of uncopyable elements");
>     }
> }
>
> be extended to support uncopyable element types?

This works for me

T[n] asStatic(T, size_t n)(T[n] x)
{
    import std.traits : isCopyable;
    static if (isCopyable!T)
    {
        return x;
    }
    else
    {
        T[n] y = void;

        // TODO why doesn't this work here?
        // import std.algorithm.mutation : moveEmplaceAll;
        // moveEmplaceAll(x[], y[]);

        foreach (const ix, ref value; x)
        {
            import std.algorithm.mutation : move;
            move(value, y[ix]);
        }

        return y;
    }
}

Why does `moveEmplaceAll` error here?