Template substitution for function parameters

Biotronic via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Sep 1 04:33:15 PDT 2017


On Friday, 1 September 2017 at 10:15:09 UTC, Nicholas Wilson 
wrote:
> So I have the following types
>
> struct DevicePointer(T) { T* ptr; }
>
> struct Buffer(T)
> {
>     void* driverObject;
>     T[] hostMemory;
> }
>
> and a function
>
> auto enqueue(alias k)(HostArgsOf!k) { ... }
>
> where k would be a function like
>
> void foo( DevicePointer!float a, float b , int c) { ... }
>
> How can I write HostArgsOf such that HostArgsOf!foo yields:
> AliasSeq!(Buffer!float, float, int)
> preferably in such a way that I can add additional 
> transformations to it later on?
>
> i.e. it substitutes the template DevicePointer for the template 
> Buffer in Parameters!foo,
> The templates can be assumed to not be nested templates, i.e. 
> DevicePointer!(DevicePointer!(float)) will never occur neither 
> will Buffer!(Buffer!(float) or any cross templates)

template k(alias fn) {
     import std.meta, std.traits;
     alias k = staticMap!(ReplaceTemplate!(DevicePointer, Buffer), 
Parameters!fn);
}

template ReplaceTemplate(alias needle, alias replacement) {
     template ReplaceTemplate(alias T) {
         static if (is(T : needle!Args, Args...)) {
             alias ReplaceTemplate = replacement!Args;
         } else {
             alias ReplaceTemplate = T;
         }
     }
}


More information about the Digitalmars-d-learn mailing list