Allowing "fall through" of attributes

Lodovico Giaretta via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jul 19 09:09:38 PDT 2016


On Tuesday, 19 July 2016 at 15:55:02 UTC, Rufus Smith wrote:
> I have some functions that take other functions. I would like 
> the attributes to be able to "fall" through so I get overload 
> like behavior. I only care that I am passing a function, not if 
> it is shared, extern(C), pure, @nogc, etc.
>
> void foo(R, A...)(R function(A) bar)
> {
>    alias type = typeof(bar);
>    pragma(msg, type);
>    // does magic with bar
> }
>
> foo never uses the attributes of bar explicitly. It uses type 
> to instantiate other functions like bar. I have to create a foo 
> for each attribute combination, which is not worth while. The 
> code seems to break only for extern, the best I can tell, most 
> attributes do pass through. But type does not contain these 
> attributes.

You shall do something like this (please note that I didn't check 
the docs while writing this; you shall definitely have a look at 
std.traits and consider the following as pseudo-code and not 
actual D):

void foo(Fun)(Fun bar)
     if (isSomeFunction!Fun)   // your constraint that bar is a 
function
{
     // how to get your R and A types, if you need them:
     alias R = ReturnType!bar;
     alias A = Parameters!bar;

     alias type = Fun;
     pragma(msg, type);

     // do some magic
}


More information about the Digitalmars-d-learn mailing list