On Thu, Jul 30, 2020 at 3:45 PM Petar via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
On Thursday, 30 July 2020 at 04:56:55 UTC, Petar Kirov
[ZombineDev] wrote:
> On Wednesday, 29 July 2020 at 16:31:08 UTC, Jean-Louis Leroy
> wrote:
>> [...]
>
> My point, that you can't do much useful processing with
> `__parameters` (except pass all of subset of it), still stands.
>
> Say you have a function with N parameters. Some of those
> parameters are integers and may have a UDA attached to them
> that specifies the minimum and maximum value they may receive.
> For example:
>
> R fun(
>   scope P1 arg1,
>   return int* arg2,
>   lazy @intetval(-16, 320) long arg3,
>   @interval(0, 127) uint arg4,
>   ref @interval(0, 8192) size_t arg5
> );
>
> The task is create a template, which given a function type like
> typeof(&fun) returns a new function type with all integer
> parameters replaced by the smallest type that is big enough to
> hold the interval specified by the UDA and preserves all
> storage classes.
>
>
> R hun(
>   scope P1 arg1,
>   return int* arg2,
>   lazy @intetval(-16, 320) short arg3,
>   @interval(0, 127) ubyte arg4,
>   ref @interval(0, 8192) ushort arg5
> );
>
> The way I'd like to go about solving this is like this:
>
> template TightenIntegerParams(Fun)
> {
>   alias TightenIntegerParams =
>     ReturnType!Fun function(
>       staticMap!(
>         TightenParam,
>         Parameters!Fun
>       )
>     );
> }
>
> However the moment staticMap internally does `Args[i]` in order
> to pass the i-th element to the mapping function `F` we lose
> all information about the storage classes and UDAs.

I now saw that Manu clarified what he meant.

Also I do realize that what we actually need is for
`Parameters!fun[0]` to return a parameter object that includes
not just the type but also the parameter name, UDAs attached and
storage classes. If for example `ref` was a type qualifier, or
just otherwise preserved by `alias`-ing it would help, but not
solve the whole issue.

UDA's and default args are in-language concepts, alias/tuples can handle them, and don't require any particularly special meta to handle.