On Friday, 8 July 2022 at 12:20:13 UTC, ryuukk_ wrote:
The problem when i try to introduce variadic template, is i can't seem to understand how to unwrap the parameter as pointer type T -> T*


```D
struct Includes(Args...) { alias args = Args; }

void view_it(Includes)(void function(entity_t, Includes.args* ) cb)
{
    // do stuff
}

```

I get the following:

```Error: cannot have pointer to `(EEntityRemoved)```

You can use [`std.meta.staticMap`][1] to make each type into a pointer individually:

```d
import std.meta;

alias Args = AliasSeq!(int, string, double);
struct Includes { alias args = Args; }
struct entity_t {}

alias PointerTo(T) = T*;

void view_it(void function(entity_t, staticMap!(PointerTo, Includes.args) ) cb)
{
    // do stuff
}
```

However, this will probably not work very well in your original code where `view_it` is a template, because the presence of `staticMap` in the parameter list will prevent the compiler from automatically deducing the template parameters.

So, in this case, I think a better solution is to make the type of the callback fully generic, and use a template constraint to enforce your requirements:

```d
import std.meta: allSatisfy;
import std.traits: isPointer;

void view_it(Callback)(Callback cb)
    if (
        is(Callback == void function(entity_t, Args), Args...)
        && allSatisfy!(isPointer, Args)
        )
{
    // do stuff
}
```

[1]: http://phobos.dpldocs.info/std.meta.staticMap.html

Reply via email to