> Now what remains is to retstrict create to only take a fun with *no* input arguments and a non-void return.
>
> How do I do that?

With a template contraint.
Not tested:

import std.traits: isCallable, ParameterTypeTuple, ReturnType;

auto create(alias fun)(size_t n)
if (isCallable!fun && ParameterTypeTuple!(fun).length == 0
&& !is(ReturnType!fun == void))
{
    import std.range: iota, map;
    return n.iota.map!(n => fun);
}